4

我的测试用例如下:

echo crypt('string', '_....salt');//error
echo crypt('string', '_A...salt');//fast
echo crypt('string', '_AAAAsalt');//slow

http://www.php.net/manual/en/function.crypt.php中所述的解释:

CRYPT_EXT_DES - 扩展的基于 DES 的散列。“salt”是一个 9 字符的字符串,由一个下划线后跟 4 个字节的迭代计数和 4 个字节的 salt 组成。这些被编码为可打印字符,每个字符 6 位,最低有效字符在前。值 0 到 63 被编码为“./0-9A-Za-z”。在 salt 中使用无效字符会导致 crypt() 失败。

点是可打印的字符,为什么它会返回错误?哪个“顺序”适用于使用的字符,导致“AAAA”的迭代次数比“A ...”多?

4

4 回答 4

1

它在引用的段落中说明了所有内容: - 最低有效字符优先 - 值 0 到 63 被编码为“./0-9A-Za-z”

因此,在您的示例中,“_....salt”意味着 0 轮显然无法工作。并且“_A...salt”小于“_AAAAsalt”,考虑到最不重要的字符首先出现。

“_...Asalt”也将超过“_A...salt”

于 2013-04-20T19:29:37.107 回答
1

这个问题有点老了,但是当我试图围绕如何在这里创建一个供内部使用的散列类时发现了这个问题,我想出了这个小函数,它将base64编码一个具有适当字符/意义的整数用作 4 个字符的“迭代计数”。可能的值是从 1 到 16,777,215

private function base64_int_encode($num){
    $alphabet_raw = "./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $alphabet = str_split($alphabet_raw);
    $arr = array();
    $base = sizeof($alphabet);
    while($num){
        $rem = $num % $base;
        $num = (int)($num / $base);
        $arr[]=$alphabet[$rem];
    }

    $arr = array_reverse($arr);
    $string = implode($arr);

    return str_pad($string, 4, '.', STR_PAD_LEFT);
}

希望它可以帮助某人!

于 2013-06-07T12:32:13.973 回答
0

Klathmon 的代码很好,但有一些错误:

第一个 - 字母

It is:
./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
Should be:
./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

第二 - 字符/数字的顺序

It generates for example: ...z
But it should generate: z...

改进后的代码:

function base64_int_encode($num) {
  $alphabet_raw='./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
  $alphabet=str_split($alphabet_raw);
  $arr=array();
  $base=sizeof($alphabet);
  while($num) {
    $rem=$num % $base;
    $num=(int)($num / $base);
    $arr[]=$alphabet[$rem];
  }

  $string=implode($arr);

  return str_pad($string, 4, '.', STR_PAD_RIGHT);
}
于 2017-12-10T12:46:58.037 回答
0

扩展 DES 中使用的数字系统:

.... - 0 (Extended DES error)
/... - 1
0... - 2
1... - 3
2... - 4
3... - 5
4... - 6
5... - 7
6... - 8
7... - 9
8... - 10

z... - 63
./.. - 64
//.. - 65
0/.. - 66
1/.. - 67

Y/.. - 100
61.. - 200
g2.. - 300
E4.. - 400
o5.. - 500
M7.. - 600
w8.. - 700
UA.. - 800
2C.. - 900
cD.. - 1000

zz.. - 4095
../. - 4096
/./. - 4097
0./. - 4098
1./. - 4099

xzzz - 16 777 213
yzzz - 16 777 214
zzzz - 16 777 215

与盐有关:

_/...salt - 1
_0...salt - 2
_1...salt - 3
_2...salt - 4
_3...salt - 5
_4...salt - 6
_5...salt - 7
_6...salt - 8
_7...salt - 9
_8...salt - 10

_z...salt - 63
_./..salt - 64
_//..salt - 65
_0/..salt - 66
_1/..salt - 67

_Y/..salt - 100
_61..salt - 200
_g2..salt - 300
_E4..salt - 400
_o5..salt - 500
_M7..salt - 600
_w8..salt - 700
_UA..salt - 800
_2C..salt - 900
_cD..salt - 1000

_zz..salt - 4095
_../.salt - 4096
_/./.salt - 4097
_0./.salt - 4098
_1./.salt - 4099

_xzzzsalt - 16 777 213
_yzzzsalt - 16 777 214
_zzzzsalt - 16 777 215
于 2017-12-10T12:54:27.453 回答