第二篇文章,主要介绍如何保证信息在网络传输过程中的安全。
我们都知道信息在传输中会被窃听、篡改、重传。如何保证他们的安全?现在最常用的就是信息加密,现在的加密方式有可逆和不可逆,比如常用的md5就是不可逆的,对称加密和非对称加密是可逆的,对称加密算法简单,消耗资源少,非对称加密算法复杂,更安全,消耗资源多。基于这些信息传输安全通常设计如下:
1)客户端产生一个登录包(包括用户账号、MD5密码信息、随机DES密钥)并使用RSA公钥加密登录包,然后将登录包发送到服务器。
2)服务器接收密文登录包,使用RSA私钥进行解密,获取登录包中的用户账号、MD5密码信息、随机DES密钥等信息。
3)服务器对用户账号密码进行校验,确认用户身份后产生一个验证包,并使用客户端生成的DES密钥加密成验证包密文并发送给客户端。
4)客户端接收验证包密文后,使用DES密钥进行解密,获取验证信息。之后的通信内容均使用DES密钥进行加密通信。
5)网络传输过程中使用https协议。
本文源码获取,关注公众号卓园科技,
发送“卓园科技小程序RSA”。
前端关键代码
//引用RSA加密工具类
var RSA = require('../../utils/rsa.js')
// RSA加密
const rsaEncrypt = data =>{
var encrypt_rsa = new RSA.RSAKey();
encrypt_rsa = RSA.KEYUTIL.getKey(publicKey_pkcs8);
//console.log('加密publicKey',encrypt_rsa)
var encStr = encrypt_rsa.encrypt(data)
encStr = RSA.hex2b64(encStr);
//console.log("▶ 加密结果",encStr)
return encStr;
}
// RSA解密
const rsaDecrypt = data =>{
var decrypt_rsa = new RSA.RSAKey();
decrypt_rsa = RSA.KEYUTIL.getKey(privateKey_pkcs8);
//console.log('解密privateKey',decrypt_rsa)
var encStr = RSA.b64tohex(data)
var decStr = decrypt_rsa.decrypt(encStr)
//console.log("▶ 解密结果",decStr)
return decStr;
}
module.exports = {
rsaEncrypt: rsaEncrypt,
rsaDecrypt: rsaDecrypt
}
后端关键代码
/**
* 公钥加密
* @param data 待加密数据
* @param pub_key 公钥
* @return 密文
* @throws Exception 抛出异常
*/
public static String encryptByPubKey(String data, String pub_key) throws Exception {
// 公钥加密
byte[] pub_key_bytes = Base64.decodeBase64(pub_key);
byte[] enSign = encryptByPubKey(data.getBytes(), pub_key_bytes);
return Base64.encodeBase64String(enSign);
}
/**
* 私钥解密
* @param data 待解密数据
* @param pri_key 私钥
* @return 明文
* @throws Exception 抛出异常
*/
private static byte[] decryptByPriKey(byte[] data, byte[] pri_key) throws Exception {
// 取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(pri_key);
KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 对数据解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}