v一、前言
这两天研究了一下项目中的密码加密,可以说得上是学到了很多。下面来大致说一下。
v二、常用加密
单向加密算法主要用来验证数据传输的过程中,是否被篡改过。
-
BASE64 严格地说,属于编码格式,而非加密算法
-
MD5(Message Digest algorithm 5,信息摘要算法)
-
SHA(Secure Hash Algorithm,安全散列算法)
-
HMAC(Hash Message Authentication Code,散列消息鉴别码
-
DES(Data Encryption Standard,数据加密算法)
-
PBE(Password-based encryption,基于密码验证)
-
RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)
-
DH(Diffie-Hellman算法,密钥一致协议)
-
DSA(Digital Signature Algorithm,数字签名)
-
ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)
参考:Java中的各种加密算法 聊一聊MD5 各种Java加密算法
v三、项目中的加密策略
创建用户:同一默认密码处理,用户登录时要修改密码。获取到默认密码之后先进行一次sha1加密,然后根据user code 和 salt进行第二次sha1加密存入数据库。
校验用户:用户登录时,js处理密码。首先进行一次sha1加密,然后进行一次rsa加密(需要向后台请求ras公钥的modulus 和 exponent)。后台通过rsa公钥对应的私钥进行解密,然后根据user code进行找到对应的用户,通过user code 和 salt进行sha1加密,将得到的结果和数据库中的进行对比。
v四、代码
js sha1算法加密(sha1.js)
encrypt.js
var sha1 = require ('xxx/sha1.js'); function _encrypt(jsSHA) { var encrypt = function(string){ var shaObj = new jsSHA("SHA-1", "TEXT"); shaObj.update(string); var hash = shaObj.getHash("HEX"); return hash; } return encrypt; } const encrypt = _encrypt(sha1) export default encrypt;
js rsa 算法加密(security.js)
前端加密示例
import RSAUtils from 'xxx/security'; import encrypt from 'xxx/encrypt'; plainPassword = encrypt(plainPassword); var key = RSAUtils.getKeyPair(exponent, '', modulus); var encryptedPwd = RSAUtils.encryptedString(key, plainPassword);
java rsa 算法(RSAUtils.java)
java rsa 公钥获取(传递给前端)
java sha 算法(PasswordUtils.java)
后端校验示例
//获取到前端传递的密码参数 password = RSAUtils.decryptStringByJs(password); //根据usercode 获取到用户 user String checkPwd = PasswordUtils.encodePasswordByUserCode(password, user.getSalt(), user.getUserCode()); assert checkPwd.equals(user.getUserPassword())
后端加密示例
UserBaseVO vo = (将要新增的用户); PasswordUtils.setSalt(vo); String shaPassword = PasswordUtils.encodePasswordUsingSHA(vo.getUserPassword()); vo.setUserPassword(shaPassword); vo.setUserPassword(PasswordUtils.encodebyUserCode(vo));