密码哈希和盐如何存储在 Symfony 数据库中?

Posted

技术标签:

【中文标题】密码哈希和盐如何存储在 Symfony 数据库中?【英文标题】:How password hash and salt stored in Symfony database? 【发布时间】:2020-05-13 11:11:21 【问题描述】:

我正在将一个项目从 Symfony 迁移到 Django。我需要导入所有有密码的用户。

为此,我需要知道密码是如何存储在数据库中的。对于每个用户密码,我需要知道 4 件事:

算法用于生成哈希

迭代次数

盐用于生成哈希

结果哈希

该项目基于 Symfony 3.4 构建。开发人员对我说,他们使用的是默认哈希算法,是 SHA512

我想迭代次数是 1。

左查找盐和结果哈希。两者都应该存储在数据库中。

在数据库的密码字段中存储如下字符串: fOEJQT89OWYfI+hBHT28RpTQRiWnyo49Rtxqv6DWY/EJ6cSkFdZ0Y36VaqjWI+1NNhRGCHBBGJvwdMD1c7GZfw==

我希望在这里找到哈希和盐 但 这里有 88 个符号。 SHA512 有一个 64 字节长的散列。

此字段中存储的数据格式是什么? 此处是否同时存储了哈希和盐?

【问题讨论】:

您好,请先查看security.yml 文件。 【参考方案1】:

您必须检查app/config/security.yml 以了解正在使用的编码器。假设您有以下内容:

security:
    encoders:
        App\Entity\User: 'sha512'

它将使用带有默认设置的 SHA512 编码器。通过查看对应的编码器MessageDigestPasswordEncoder,我们可以推测它默认使用 5000 次迭代,然后对其进行 base64 编码。

剩下的唯一事情就是弄清楚是否使用了盐,如果是的话,它是如何生成的。由于 SHA512 不会生成它自己的盐,因此您必须查看用户类并检查其 User::getSalt 方法。如果返回 null,则说明没有使用 salt,否则您将不得不模仿其行为或在生成密码时检索结果。

【讨论】:

以上是关于密码哈希和盐如何存储在 Symfony 数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中使用 scrypt 生成密码和盐的哈希值

C# 中的哈希和盐密码

离线Android应用程序的密码保护[重复]

什么是Drupal的默认密码加密方法?

C ++和PHP通用密码哈希标准

针对 Scrypt 组合哈希验证 python 密码:(设置+盐+哈希)