【问题标题】:Appending CSPRNG generated salt to a string that needs to be hashed将 CSPRNG 生成的盐附加到需要散列的字符串
【发布时间】:2013-10-14 19:27:48
【问题描述】:

阅读generating salt using Cryptographically Secure Pseudo-Random Number Generator (CSPRNG)。然后,此盐将附加到需要散列的字符串中。

但是,CSPRNG 函数生成的盐(对于 PHP,我使用的是openssl_random_pseudo_bytes)实际上是二进制数据。

对于如何将此二进制数据附加到字符串感到困惑,我看到了PHP example for creating hash。它对二进制数据进行编码。

所以我只是想知道这是否是我需要做的。我需要对盐进行编码以获得字符串。然后我可以将该盐附加到需要散列的字符串中。还是有其他方法可以在字符串中添加盐?

注意我没有散列密码

【问题讨论】:

  • 你在散列密码吗?在这种情况下,您应该使用专门的密码哈希函数来处理所有这些问题。例如,对于基于 bcrypt 的散列,有一种使用 variant of Base64 的标准技术。
  • 那么使用盐是不寻常的。加密时,我们通常使用 IV。如果没有足够的背景信息,我们无法真正帮助您。
  • 为什么需要将盐转换为字符串?哈希函数将字节作为输入。

标签: php encryption encoding cryptography


【解决方案1】:

如果您需要散列密码,请使用password_hash()password_verify(),并可能添加password_needs_rehash() - 请参阅http://de2.php.net/password_hash

您可能会注意到这些函数从 PHP 5.5.0 开始可用 - 如果您使用的是早期版本的 PHP,您可以添加 this compatibility library 以使其与 PHP 5.3.7 开始一起使用。

再简单不过了。

【讨论】:

  • 但是你应该看看 github 存储库,看看 openssl_random_pseudo_bytes 的返回值是如何用作哈希的盐的。
【解决方案2】:

最好先使用编码将字符串转换为二进制数据。 UTF-8 编码可能最适合大多数用例。不要忘记(至少)记录使用了哪种字符编码。

现在连接盐和编码字符串。同样,您需要(至少)记录盐的大小。请确保使用字节连接,而不是字符串。字节可以有任何值,包括无效字符、控制字符等。

连接后,您可以将生成的字节数组输入散列函数。


如果您在 PHP 中遇到字节连接问题,您可以改用十六进制值。但是不要忘记在将它们输入哈希方法之前将它们转换回字节。

【讨论】:

    猜你喜欢
    • 2015-05-23
    • 2014-09-09
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2012-07-12
    • 2012-11-04
    相关资源
    最近更新 更多