提交 31c87313 编写于 作者: DCloud_Heavensoft's avatar DCloud_Heavensoft

Update secure-network.md

上级 7b8ac6a2
**云端一体安全网络**
> HBuilderX 3.6.2+ 支持
> HBuilderX 3.6.6+ 支持
## 简介
网络安全的问题很多:
1. 客户端受信。因为过去采用无状态网络通过接口交换数据,客户端的真实性很难保证
2. 网络抓包,即便是https的请求也会被抓包
1. 客户端受信。由于http的无状态,客户端的真实性很难保证。模拟客户端、重签apk,防不胜防
2. 网络受信。即便是https的请求也会被抓包,路由器、地方运营商都可能获取你的数据、劫持和改写你的请求
当攻击者了解了你的服务器接收什么样的数据时,就可以冒名客户端,提交假数据来攻击你的服务器。
尤其当你的业务中涉及促销、返佣、激励视频等场景,非常容易被刷。褥羊毛已经是一个非常成熟的灰产。
尤其当你的业务中涉及促销、返佣、激励视频等场景,非常容易被刷。褥羊毛已经是一个非常成熟的灰产,哪里有漏洞,哪里就有他们赚钱的机会
DCloud面向开发者同时提供了端引擎`uni-app` 和 云引擎`uniCloud`其实可以提供云端一体的安全网络的能力。
DCloud面向开发者同时提供了端引擎`uni-app` 和 云引擎`uniCloud`如今进一步升级,提供云端一体的安全网络的能力。
`uni-app` 连接 `uniCloud` 时,可以选择是否启动安全网络。它通过高安全的保护机制,防止客户端伪造和通信内容抓包。
`uni-app` 连接 `uniCloud` 时,可以选择是否启动安全网络。它通过高安全的保护机制,解决了客户端受信和网络受信的问题,防止客户端伪造和通信内容抓包。
注意:安全网络不支持web平台,只支持微信小程序和App。并且App的安全级别更高。
......@@ -25,9 +25,40 @@ DCloud面向开发者同时提供了端引擎`uni-app` 和 云引擎`uniCloud`
|:-:|:-:|
|3.6.6+|3.6.6+|
## 准备工作
## 如何开通
### 微信小程序@mp-weixin
App和微信小程序略有区别,但大体都要经过如下流程:
1. 在dev.dcloud.net.cn的应用管理中指定要开通的应用,在“各平台信息”中配置app的包名、签名摘要或者微信小程序的appid。
2. 在uniCloud web控制台选定一个服务空间,选择安全网络,关联某个app。
两个平台细化说明如下。
### App平台开通安全网络@app
1.[开发者中心](https://dev.dcloud.net.cn/)`应用详情 --> 证书管理`内填写安卓应用的包名、签名和iOS应用的bundleId。一个应用只能有一个发行证书配置,但是可以有多个开发证书配置
【图片待补充】
2. 在uniCloud控制台关联允许发送安全网络请求的应用
【图片待补充】
3. 在项目根目录manifest.json文件内为app平台开启安全网络模块
【图片待补充】
注意:打包后生效。测试时需打包[自定义基座](../tutorial/run/run-app.md#customplayground)
4. 在服务空间创建数据表[opendb-app-client-key](缺链接!!!!!!!!!!)用于保存发放给客户端的密钥对
- 切勿删除或修改此集合内容,否则会导致部分客户端不能发送安全网络请求(重新安装客户端或清除客户端数据后才能正常使用)
- 如果服务空间开通了redis会在redis内存储一份客户端密钥对以加速安全网络请求的处理,所使用的键为`unicloud:encryption:app-client-key:{appId}:{deviceId}:string`
5. 上传任意schema文件到服务空间以触发一次clientDB云端模块的更新
**这只写了云打包,离线打包呢?!!!!!!!**
### 微信小程序开通安全网络@mp-weixin
安全网络在微信小程序上的实现,依赖了微信提供的一些用户级的凭据。所以需要下载`uni-id-pages``uni-open-bridge`,并在app.vue里初始化。
......@@ -130,34 +161,16 @@ App.vue页面需要补充如下代码:
【图片待补充】
### App@app
App平台安全网络需使用[自定义基座](../tutorial/run/run-app.md#customplayground),App端安全网络不依赖于登录逻辑。
## 数据加密传输的开发方式
1.[开发者中心](https://dev.dcloud.net.cn/)`应用详情 --> 证书管理`内填写安卓应用的包名、签名和iOS应用的bundleId。一个应用只能有一个发行证书配置,但是可以有多个开发证书配置
如果你只需要客户端身份验真,不需要对网络传输的数据加密,那么参考上一章节的文档就够了。
【图片待补充】
如果还需要加密传输的数据,则在客户端和服务器都要编写代码,倒不需要写具体的加密解密算法,而是需要在客户端指定哪些请求、哪些数据要加密,而在云端要校验客户端是否指定了正确的条件。
2. 在uniCloud控制台关联允许发送安全网络请求的应用
具体写法如下:
【图片待补充】
3. 在项目根目录manifest.json文件内为app平台开启安全网络模块
【图片待补充】
4. 创建集合`opendb-app-client-key`用于保存发放给客户端的密钥对
- 切勿删除或修改此集合内容,否则会导致部分客户端不能发送安全网络请求(重新安装客户端或清除客户端数据后才能正常使用)
- 如果服务空间开通了redis会在redis内存储一份客户端密钥对以加速安全网络请求的处理,所使用的键为`unicloud:encryption:app-client-key:{appId}:{deviceId}:string`
5. 通过上传schema触发一次clientDB云函数的更新
## 调用方式
准备工作完成后,在uni-app客户端调用uniCloud服务器时,可以通过参数来声明这次请求走安全网络,对传输数据加密。
### 云函数
### 客户端请求云函数
客户端通过callFunction调用云函数时,加入secretType参数。
```js
......@@ -170,16 +183,20 @@ uniCloud.callFunction({
})
```
### 云对象
也就是每个callFunction请求,都可以指定是否加密,以及是对上行数据还是下行数据加密。
### 客户端请求云对象
客户端通过importObject调用云对象时,通过secretMethods参数来配置每个方法调用时是否加密。
```js
uniCloud.importObject('object-name', {
secretMethods: {'login':'both'} // 支持配置所有方法设置加密参见下面的 secretMethods 说明
secretMethods: {'login':'both'} // 对login方法设置为上下行的数据均要加密。也支持配置所有方法设置加密,参见下面的 secretMethods 说明
})
```
也就是云对象导入时配置某个方法的请求是否要加密,以及是对上行数据还是下行数据加密。那么在客户端调用云对象的相应方法时会自动按这个配置执行。
### clientDB
暂不支持
......@@ -188,11 +205,13 @@ uniCloud.importObject('object-name', {
|值 |描述 |
|:-: |:-: |
|none |不加密,默认值 |
|none |上下行都不加密,默认值 |
|request |只加密客户端请求时的上行数据,服务器下发数据不加密 |
|response |客户端请求时不加密数据,只加密服务器下发的数据 |
|both |客户端和服务器上行下行数据都加密数据 |
- 之所以提供如此精细的加密配置,是因为加解密都是消耗资源的,增加了等待时间。一般只对真正需要防止网络窃取的保密数据才加密。
**secretMethods 属性说明**
`secretMethods` 是云对象中指定需要加密的方法名。
......@@ -204,19 +223,21 @@ uniCloud.importObject('object-name', {
**注意**
- 微信小程序安全网络依赖于登录逻辑,因此在客户端检测到发送安全网络请求时用户未登录时会自动调用uni-id-co的loginByWeixin接口
- 微信小程序安全网络依赖于登录逻辑,因此在客户端检测到发送安全网络请求时,若用户未登录则会自动调用uni-id-co的loginByWeixin接口
## 服务器端
虽然uni-app客户端和uniCloud云端通信是加密的,但对于开发者而言过程是透明的。
uni云端一体安全网络,已经在底层封装好了复杂的安全相关的算法。开发者只需关心对哪些请求、哪些数据进行加密。
**不管是客户端接收云端数据、还是云端接受客户端数据,开发者的代码拿到的数据永远都是解密后的数据。**
**不管是客户端接收云端数据、还是云端接受客户端数据,开发者的代码拿到的数据都是解密后的数据。**
但云端有一个注意事项:为了避免客户端伪造`secretType`获取服务器敏感数据,应以服务器端为准,如果客户端携带的 `secretType` 不符合要求应拒绝响应数据。
但云端有一个注意事项:为了避免客户端伪造`secretType`获取服务器敏感数据,应以服务器端为准,如果客户端携带的 `secretType` 不符合要求应拒绝响应数据。示例代码如下
示例代码如下:
### 云函数中验证secretType
在云函数的context中有secretType。
在云函数的context中有secretType。如果这个云函数的返回数据必须加密,那么应该使用如下方式校验客户端的请求是否合法。
```js
exports.main = async (event, context) => {
......@@ -224,14 +245,14 @@ exports.main = async (event, context) => {
// secretType 是客户端调用 uniCloud.callFunction 传递的参数 secretType
if (secretType !== 'both' || secretType !== 'response') {
return null
return null // 拒绝返回有效数据
}
}
```
### 云对象中验证secretType
在云对象的this中有secretType。
在云对象的this中有secretType。如果这个云对象的reward方法的返回数据必须加密,那么应该使用如下方式校验客户端的请求是否合法。
```js
module.exports = {
......@@ -243,7 +264,7 @@ module.exports = {
// secretType 是客户端调用 uniCloud.importObject 传递的参数 secretMethods
if (methodName === 'reward' && (secretType !== 'both' || secretType !== 'response')) {
throw new Error('secretType invalid')
throw new Error('secretType invalid') // 拒绝返回有效数据
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册