【问题标题】:Using bcrypt: How many bytes should I allocate?使用 bcrypt:我应该分配多少字节?
【发布时间】:2012-08-02 13:56:58
【问题描述】:

我正在使用 PHP 将密码存储在 SQL 数据库中,并计划使用 bcrypt。

我正在做一些研究,以找出我应该使用什么类型和大小将哈希和盐存储在我的数据库中。

基于对this question 的出色回答,bcrypt 似乎有时会输出不同大小的哈希值,可能与CHAR(76)BINARY(60) 一样大。但我不明白何时以及为什么。

该问题提供了一个link,它表示使用$2$ 方案会产生59 个字节,而$2a$ 会产生60 个字节。然而,今天的 php 文档 crypt 建议使用 $2y$ 而不是 $2a$,出于某种原因,由于高位攻击或其他原因。无论如何,我想按照推荐使用$2y$,但是没有迹象表明它会输出的大小。

我在数据库中的字段大小应该是多少?

另外,CHARBINARY 在这类应用程序中有什么实际区别吗?

【问题讨论】:

标签: php sql hash bcrypt


【解决方案1】:
  1. 哈希:CHAR(60)
  2. 盐:CHAR(22)

这可以通过实验找到:

<?php
    $salt1 = "FotZoGZruCl8ugk0Tvl4g";
    $salt2 = "FotZoGZruCl8ugk0Tvl4g9";
    $salt3 = "FotZoGZruCl8ugk0Tvl4g9a";

    print 'Salt 1 (stlen = ' . strlen($salt1) . '): ' . $salt1 . '<br />';
    print 'Salt 2 (stlen = ' . strlen($salt2) . '): ' . $salt2 . '<br />';
    print 'Salt 3 (stlen = ' . strlen($salt3) . '): ' . $salt3 . '<br />';

    $hash1 = crypt('password1', '$2y$07$' . $salt1);
    $hash2 = crypt('password1', '$2y$07$' . $salt2);
    $hash3 = crypt('password1', '$2y$07$' . $salt3);

    print 'Hash 1 (strlen = ' . strlen($hash1) . '): ' . $hash1 . '<br />';
    print 'Hash 2 (strlen = ' . strlen($hash2) . '): ' . $hash2 . '<br />';
    print 'Hash 3 (strlen = ' . strlen($hash3) . '): ' . $hash3 . '<br />';
?>

输出将是:

Salt 1 (stlen = 21): FotZoGZruCl8ugk0Tvl4g
Salt 2 (stlen = 22): FotZoGZruCl8ugk0Tvl4g9
Salt 3 (stlen = 23): FotZoGZruCl8ugk0Tvl4g9a
Hash 1 (strlen = 60): $2y$07$FotZoGZruCl8ugk0Tvl4g.pXg.UBUUwuj14Ur1d.z/tMLqGPxQLBW
Hash 2 (strlen = 60): $2y$07$FotZoGZruCl8ugk0Tvl4guNd47GUslNQPXiel70rI0yvffP7iPSHe
Hash 3 (strlen = 60): $2y$07$FotZoGZruCl8ugk0Tvl4guNd47GUslNQPXiel70rI0yvffP7iPSHe

您会注意到,如果您添加超过 22 个字符的盐,哈希值将保持不变。也就是说,crypt 会在执行哈希之前将 salt 截断为 22 个字符。

仅供参考,随机生成盐:

$salt = substr(strtr(base64_encode(mcrypt_create_iv(17, MCRYPT_DEV_URANDOM)), "=+", "./"), 0, 22);

编辑: 此外,盐/哈希的格式是 64 进制。即使用 a-z、A-Z、0-9、'.'和 '/' 作为数字,每个数字代表一个从 0 到 63 的值...所以在数据库中使用 CHAR 相对于 BINARY 很好,因为您可以用 CHAR 表示所有这些数字。

【讨论】:

    【解决方案2】:

    大小相同 - 60 个字符。 ($2$$2a$的唯一区别是前者少了一个字符,实际hash部分大小相同。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      相关资源
      最近更新 更多