张颖

8个月前
  • 1626

    浏览
  • 1

    评论
  • 1

    收藏

前端动态加盐慢加密方案图解

本文作者:imweb 张颖 原文出处:imweb社区 未经同意,禁止转载

加密:利用某种加密算法,将明文转换成无法简单识别的密文。

解密:利用相应的解密算法,将密文转换成可识别的明文。

密码破解:1、算法逆向破解(一般算法都是不可逆的);2、穷举暴力破解 3、查表,实际上表也是提前穷举跑出来的。

慢加密:提高加密时间来相应的加大破解时间和难度。

慢加密出现的原因:密码破解的时间和加密算法是直接关联的,例如 MD5 加密是非常快的,加密一次耗费 1 微秒,那破解时随便猜一个词组,也只需 1 微秒,攻击者一秒钟就可以猜 100 万个。如果加密一次提高到 10 毫秒,那么攻击者每秒只能猜 100 个,破解速度就慢了一万倍。提高加密时间有两种方法,一是多次加密,二是加大加密算法的复杂度。

但如果是服务器端加密,使用慢加密的网站,如果同时来了多个用户,服务器 CPU 可能就不够用了。所以前端加密在客户端拥有强大的计算能力的今天,逐渐被考虑。

慢加密过程:

破解方法: 暴力的穷举生成字典法

为了对抗这种破解方法,还得用经典的手段:加盐。加密过程中针对不同的用户引入不同的盐值,即可对抗这种常规的暴力穷举字典破解方法。

加盐慢加密:

这样,即使相同的密码,对于不同的用户,「慢加密结果」也不一样了。

由于用户的盐值也是需要存储在后台的,用户登录时,在输入用户名后,我们必须获取用户盐值才能加密明文密码进行提交验证:

为了更安全,可以定期的更换用户盐值:

由于不同的用户计算机的性能不一样,如何把握慢加密算法的强度很重要,如果用户计算机性能过差,而慢加密算法强度过高,会造成用户登录过慢的问题,所以设计加密算法时,可以根据用户侧的计算性能动态决定加密算法的强度,设此强度为S,在用户注册或登录时,可以根据用户计算性能检测程序段来设定强度S的值,此值会与用户名、密码以及盐值一同存在服务器上:

一般用户侧计算性能的评估也很简单,计算一定时间内的计算处理能力就行:


setTimeout(function() {
    flag = false;
    console.log(S);
}, 1000);

while(flag) {
    x = hash(x);
    S++;
}
1 条评论