存储一个密码:
- 使用CSPRNG生成一个长的随机盐。
- 将密码和盐拼接在一起,使用标准的加密hash函数比如SHA256进行hash
- 将盐和hash记录在用户数据库中
盐要使用密码学上可靠安全的伪随机数生成器(Cryptographically Secure Pseudo-Random Number Generator (CSPRNG))来产生。CSPRNG跟普通的伪随机数生成器比如C语言中的rand(),有很大不同。正如它的名字说明的那样,CSPRNG提供一个高标准的随机数,是完全无法预测的。
验证一个密码:
- 从数据库中取出用户的盐和hash
- 将用户输入的密码和盐按相同方式拼接在一起,使用相同的hash函数进行hash
- 比较计算出的hash跟存储的hash是否相同。如果相同则密码正确。反之则密码错误。
Mark & TODO: https://core.telegram.org/api/end-to-end