和朋友讨论一个有争议的话题:
有人认为密码加密可以直接在服务器端进行,不需要在客户端进行;当然,也有人认为可以在客户端进行密码加密,以减轻服务器的压力。
如果你想问宋哥在项目中怎么做,我会告诉你,我们在客户端对密码进行加密。
为什么要这样做?
让我和你谈谈我们的想法。
1.烫手山芋
首先,我们有一个共识,明文密码是烫手山芋,是定时炸弹,应该尽快处理。
将这样的炸弹从前端运输到后端,然后进行加密,似乎并不是一个好主意。炸弹在运输前应尽早处理掉。
那么客户端对密码进行加密的目的是什么呢?防止密码在传输过程中泄露?
显然不是!
对于重放攻击,人们并不关心你是否在客户端对密码进行了加密。对于重放攻击,密码在客户端是否加密并不重要。
什么是重放攻击?重放攻击( )是一种网络安全攻击,攻击者拦截并重新发送先前捕获的数据包,以欺骗或破坏系统。这种攻击通常发生在没有正确实现消息认证和完整性保护的系统中。一般来说,重放攻击具有三个特点:
无需破解加密:攻击者不需要知道加密算法或密钥,只需复制并重放数据包即可。依赖于协议的缺陷:如果协议设计不好,没有实现时间戳、序列号或一次性令牌等机制,则很容易出现重放攻击。可重复性:攻击者可以多次重放同一个数据包,试图获得相同的结果。
一般来说,解决重放攻击最有效且无故障的方法是使用HTTPS。
客户端对密码进行加密的目的是为了防止明文密码到达后端后被滥用。这是主要目的。
为了增加破解成本,在前端加密时可以使用慢速哈希函数。
2.什么是慢哈希?
Slow Hash 是一种加密哈希函数,旨在故意减慢处理速度以增加破解难度。
此功能通常用于密码存储、密钥派生和某些加密算法,以提供额外的安全层以防止暴力攻击。
一般来说,慢哈希函数主要有以下几个特点:
计算成本高:故意设计为需要更多计算资源(CPU 时间或内存),使暴力攻击变得不切实际。内存密集型:许多慢速哈希函数需要大量内存,这使得并行处理变得困难,因为每个哈希计算实例都需要独立的内存空间。抵抗暴力破解:由于计算成本较高,缓慢的哈希函数使得暴力破解(尝试所有可能的密码直到找到匹配)非常困难。 Salt:慢哈希函数通常与盐结合使用,盐是随机生成的数据,用于与密码组合,以确保即使两个用户使用相同的密码,其哈希值也会不同。密钥扩展(Key):通过哈希过程的多次迭代,进一步增加破解难度。
常见的慢哈希函数主要有以下几种,在我们当中也比较常见:
例如,如果我们控制的执行时间约为0.1秒完成一次哈希计算,按照1秒内生成10个哈希值的速度,算出所有10个大写和小写组成的弱密码大约需要P左右字母和数字。 (62,10)/(3600×24×)=1,237,204,169年。
3. 一次性用户注册
了解慢速哈希之后,让我们看看完整的用户注册应该是什么样子。
首先,用户在客户端输入明文密码123。
接下来,客户端使用哈希函数对密码进行加密。如果你想更加谨慎,还可以使用用户名等信息作为盐来防止彩虹表攻击。
现在客户端可以将密码发送到服务器。
服务器收到客户端发来的消息后,可以将客户端发送的密码在服务器眼中视为明文,并按照明文处理流程进行加密存储。这件事宋哥在中和讲得太多了。我不再赘述细节。
这就是用户注册过程。
将来,用户登录实际上是一样的。
用户在客户端输入密码后,客户端现在将其加密,然后上传到服务器。然后服务器按照我们讨论的方式处理它。