mysql - 如何通过网络对密码进行哈希和加密?

标签 mysql encryption hash cryptography

我正在处理一个宠物项目,我想添加用户注册支持。经过一番研究后,我决定在数据库中保存散列密码和盐,而不是原始密码。然而,我对步骤是什么以及顺序感到困惑。以下是我的假设:

注册

  1. 客户端将用户名和密码发送到服务器 (https)
  2. 服务器获取密码,生成随机盐
  3. Base64 编码盐
  4. 使用 stringify salt 对密码进行哈希处理
  5. 对密码进行 Base64 编码
  6. 将密码和盐保存到数据库

登录

  1. 客户端将用户名和密码发送到服务器 (https)
  2. 服务器获取用户名和密码,从数据库中查找散列的 psw 和 salt
  3. 使用盐对密码进行哈希处理,对结果进行 Base64 编码
  4. 将密码与数据库中的散列 psw 进行比较
  5. 如果匹配,则验证用户身份

我正在按照我的假设实现我的系统,一切似乎都有效。但是我不确定 Base64 编码部分。将密码和盐从二进制编码为字符串的目的是什么?我可以跳过此步骤吗?如果我假设的过程是错误的,正确的步骤是什么?

P.S 我使用express.js作为服务器,mysql作为数据库

最佳答案

总体思路是好的,但我有一些评论:

  • 您应该使用 PBKDF(一种基于密码的 key 派生函数),而不是使用哈希。最好使用标准化版本,即 PBKDF2。与盐一起,您还应该选择多次迭代来阻止攻击。
  • 确保用户名和密码始终使用相同的字符编码。
  • 加密算法应基于二进制输入和输出。
  • 将二进制数据存储或加载到文本演示文稿时,应分别使用 Base 64 编码/解码。

因此该方案存在以下问题:

  • 使用哈希而不是 PBKDF。
  • 使用 Base 64 编码盐作为哈希的输入。

关于mysql - 如何通过网络对密码进行哈希和加密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14510367/

相关文章:

mysql - SQL 查询从数据表中选择不同的值以及相应的列值

mysql - 如何使用 Jena SDB 插入/更新/删除个人以保持最佳性能?

java - Rot 13 最小版本 Java

perl - 哈希 perl 的切片哈希

ruby - 关于 ruby​​ hashes 的恼人问题

php - Laravel .env DB_HOST 127.0.0.1 与本地主机

mysql - 无法连接到 mysql docker 容器

java - BouncyCaSTLe PGP 和 McAfee eBusiness Server 8.6 不兼容

encryption - 压缩后的数据加密标准 (DES) 更大?

python - 如何在Python中定义哈希函数