第一次加密
防范前端:
如果网站采用http协议传输数据,http协议是不做任何数据保护的,数据明文公布在请求里,那么登录请求若被截取,那么密码也会被截获。
第一次加密将会在前端进行一次MD5加密,以加密后的形式发送给服务端。
如果js源码被破解,那么第一次加密将无效。
代码如下,最后的password将会被发送给服务端。可以发现,如果js被破解,那么自定义的加密规则与固定salt也会被看到,那么再反推。
var g_passsword_salt="1a2b3c4d"
var salt = g_passsword_salt;
var str = ""+salt.charAt(0)+salt.charAt(2) + inputPass +salt.charAt(5) + salt.charAt(4);
var password = md5(str);
第二次加密
防范后端数据库:
为什么要做第二次加密。 如果数据库被盗,那么用户密码字段也会暴露,虽然已经经过一次MD5加密,但是寻常的MD5加密后数据依然可能会被推算出来(例如彩虹表)。
哈,所以第二次加密也只不过是在给破解增加难度,因为没有绝对安全的系统,再精密的设计也架不住暴力推演。
代码如下,用户在注册时会在前端的加密基础上再进行一次加密后,最后将二次加密后的密码存入数据库。
注意:在js前端的salt是固定的,但是后端的salt是在用户注册时随机生成的。
如果后台代码没有被破解,那么第二次加密相对是比较安全的。即使数据库被破解,hack拿到了密码和salt,也是拿不到正确的密码的,因为salt的使用规则是定义在后台代码里的。
/**
* formPass参数是前端传来已经被第一次加密过的密码
* salt 是用户在注册时生成的随机规则 是存在于用户表里的
**/
public static String formPassToDBPass(String formPass, String salt) {
String str = ""+salt.charAt(0)+salt.charAt(2) + formPass +salt.charAt(5) + salt.charAt(4);
return md5(str);
}