为保证敏感数据在网络传输过程中与保存在云端时的安全,必须要加密,如用户的密码、手机号、邮箱、住址等,加密可分为不可逆和可逆两种方式,如网络传输时选择可逆的加密方式,在云端保存数据时,用户密码使用不可逆加密,手机号、邮箱、住址等选择可逆的加密。

目前使用最多的是RSA和MD5,rsa可逆,先生成一套或多套密钥,公钥保存在客户端,私钥保存在云端,公钥加密,私钥解密,MD5不可逆(这里不考虑md5破解的问题,实际编码时会选择加盐,提高破解难度)。
uni-app,uniCloud中可以使用fucking-util-signature-all,提供常用的加密方式,实际是一个封装体,使用node-rsa, js-md5,js-sha256等模块。
// npm 安装 // 云函数使用的时需要在去函数目录安装 npm install fucking-util npm install fucking-util-signature-all
// 项目中引用 var Signature = require("fucking-util-signature-all");
// rsa 生密钥, 可设置生成密码的格式与强度 // 生成密钥的代码无需放在项目中,只需要生成一次,生成后保存好密钥 // 注意密钥需要保存完整的PEM格式(包含格式信息) // 否则node-rsa会报错 let { publicKey, privateKey } = Signature.RSA.generateKeys(2048, 'pkcs8'); console.log (publicKey, privateKey); // 定义rsa对象, 并设置密钥 let rsa = new Signature.RSA(); // 设置公私钥 // 客户端上只保存和设置公钥 rsa.setPublicKey(publicKey); rsa.setPrivateKey(privateKey); // 加密 let encrypted = rsa.encrypt('unencrypt', 'base64'/*buffer|binary|hex*/ ); // 解密 let decrypted = rsa.decrypt(encrypted);
// md5签名与验证 // 定义md5对象 let md5 = new Signature.MD5(); // 不加盐签名 let signed = md5.sign('unsigned', 'base64'/*hex|base64 默认为base64*/); // 加盐签名,举个例子 let salt = md5.sign('salt two' + md5.sign('salt one'+'unsigned'));
实际项目中使用rsa加解密时,不会每次使用时都编码生成对象,然后设置密钥,一般会再次对rsa进行封装,密钥独立放一个文件,对象的生成独立放一个文件,如下简单定义一个rsa-service.js
// rsa-service.js // 配置密钥,例子中只设置一套密钥 const pubKey = '-----BEGIN PUBLIC KEY----- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -----END PUBLIC KEY-----'; const priKey = '-----BEGIN PRIVATE KEY----- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -----END PRIVATE KEY-----'; // 引用模块 const Signature = require("fucking-util-signature-all"); // 生成rsa对象 const rsa = new Signature.RSA(); // 设置密钥 rsa.setPrivateKey(priKey); rsa.setPublicKey(pubKey); // 导出加密解密方式 module.exports = { encrypt: function(input, format='base64') { return rsa.encrypt(input, format); }, decrypt: function(input) { return rsa.decrypt(input); } }
使用时只需要引用自己封装的ras-service.js
const rsa = require('./rsa-service.js') let encrypted = rsa.encrypt('unencrypt'); let decrypted = rsa.decrypt(encrypted);


还没有评论,来说两句吧...