大家好,我是欧达克。
不知道大家工作中是否有参与过注册登录流程,你们公司的注册登录都是怎么做的呢?最近在梳理注册登录流程,发现注册登录时对密码的加解密挺有讲究的,都知道密码不能明文传输,注册时前端加密,服务端解密,流程能说个一二,但是整体怎么做似乎又说不上来。我们将从最简单的加密流程一直升级到复杂系统,看看都是怎么做的。

明文传输

对你们听错,很多早期的论坛、小网站直接明文存储密码,或简单 Base64 编码,相当于裸奔!
前端单向哈希

前端使用 MD5、SHA256 等哈希算法,将密码加密后传给服务端。虽然避免了明文传输和存储,但是都容易被彩虹表暴力破解,也无法防止重放攻击,同时哈希也降低了密码的熵。
加盐哈希

为每个用户分配一个盐值,服务端存储盐值+哈希值。能够防御彩虹表攻击,但是弱密码可以被暴力破解,同时传输层未加密,盐值也可能被截获。从技术实现的角度,前端在加密前,必须获取对应的盐值,服务端也必须为每个用户存储单独的盐值,提高了系统设计复杂度。
传输层加密+慢哈希算法

使用 HTTPS 加密传输,防窃听、防篡改、身份验证,不再担心前后端数据传输过程中的安全性。同时慢哈希算法(如 bcrypt、PBKDF2)也使得暴力破解的成本更高,从实现上不需要我们单独存储盐值,算法直接将盐值保存在密文中。
非对称加密

前端使用 HTTPS + 公钥加密双重保护,服务端先通过密钥管理服务获取私钥,确定是通过公钥加密后的密文,再通过慢哈希算法加密,保存到数据库中,这种方式已经足够安全可靠了。
但是对于一些特别的行业,是不允许服务端拿到明文密码的,比如我前司是做钱包相关业务的,明确规定,服务端任何情况下,不管是内存还是数据库(这里更不用说日志了),都不能出现明文密码。所以在该方案的基础上做了升级,前端在使用公钥加密前,先对明文密码哈希加密,其他流程保持不变。

总结
现在的认证已经越来越去密码化了,很多都采用生物识别➕硬件保护的方式。密码安全是攻防对抗和技术迭代的持续过程,所有方案都需平衡安全性、用户体验与合规要求。我个人的自建小网站,也是采用的前端公钥加密,服务端私钥解密+慢哈希存储的方式,整体方案和前司没什么区别(前司因为合规加了哈希),无非就是在一些认证方式、风控识别、密钥管理工具(AWS KMS)等方面的差异。