我正在处理一个宠物项目,我想添加用户注册支持。经过一番研究后,我决定在数据库中保存散列密码和盐,而不是原始密码。然而,我对步骤是什么以及顺序感到困惑。以下是我的假设:
注册
- 客户端将用户名和密码发送到服务器 (https)
- 服务器获取密码,生成随机盐
- Base64 编码盐
- 使用 stringify salt 对密码进行哈希处理
- 对密码进行 Base64 编码
- 将密码和盐保存到数据库
登录
- 客户端将用户名和密码发送到服务器 (https)
- 服务器获取用户名和密码,从数据库中查找散列的 psw 和 salt
- 使用盐对密码进行哈希处理,对结果进行 Base64 编码
- 将密码与数据库中的散列 psw 进行比较
- 如果匹配,则验证用户身份
我正在按照我的假设实现我的系统,一切似乎都有效。但是我不确定 Base64 编码部分。将密码和盐从二进制编码为字符串的目的是什么?我可以跳过此步骤吗?如果我假设的过程是错误的,正确的步骤是什么?
P.S 我使用express.js作为服务器,mysql作为数据库
最佳答案
总体思路是好的,但我有一些评论:
- 您应该使用 PBKDF(一种基于密码的 key 派生函数),而不是使用哈希。最好使用标准化版本,即 PBKDF2。与盐一起,您还应该选择多次迭代来阻止攻击。
- 确保用户名和密码始终使用相同的字符编码。
- 加密算法应基于二进制输入和输出。
- 将二进制数据存储或加载到文本演示文稿时,应分别使用 Base 64 编码/解码。
因此该方案存在以下问题:
- 使用哈希而不是 PBKDF。
- 使用 Base 64 编码盐作为哈希的输入。
关于mysql - 如何通过网络对密码进行哈希和加密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14510367/