所有需要登录的网站,都会提供"找回密码"的功能,防止用户忘记密码。
正确设计这个功能,保证安全可靠,并不简单。下面就是安全专家 Troy Hunt 给出的设计指南。
一、如何保存密码
一个网站要想保证密码安全,第一步就是以正确的方法保存密码。一般说来,密码有三种保存方式。
(1)明文保存
"明文保存"就是用户的密码原文不动地写入数据库。这种方式最不安全,极易泄漏,应该严格禁用。
(2)加密保存
"加密保存"就是使用密钥,将密码加密后,以密文保存进数据库。这种方式虽然有一定的安全性,但是终究还是可以用密钥还原密码。因此,还是存在泄漏的可能,也不推荐使用。
(3)哈希保存
"哈希保存"就是对密码使用哈希算法,将哈希值保存进数据库。为了增加随机性,防止彩虹表这一类的工具,计算哈希的时候,每个用户都有一个不一样的盐值(salt),也会同时保存进数据库。
哈希是单向运算,无法还原,所以即使哈希值泄漏,一般来说,也不会暴露用户的原始密码。
第一条规则:密码永远都要哈希保存。
二、密码重置
如果密码是哈希保存,用户一旦忘记密码,网站也无法知道原始密码是什么,只能让用户重置密码。
第二条规则:找回密码就是让用户重置密码。
重置密码又有两种做法。有的网站先自动改成一个随机密码,然后再让用户登录后自己改掉。这样做的