微信小程序(二)RSA 加密

        第二篇文章,主要介绍如何保证信息在网络传输过程中的安全。

        我们都知道信息在传输中会被窃听、篡改、重传。如何保证他们的安全?现在最常用的就是信息加密,现在的加密方式有可逆和不可逆,比如常用的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);
    }

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值