如何将我的令牌缩短为哈希sha512的40个字符?

时间:2013-07-10 15:03:35

标签: php

为了简单起见我只想回显 sha512 的前40个字符

$salt = "fRY^YXCH%^ER^*&^";
$profiletoken = hash("sha512", $salt . $user . $id . $value);
echo $profiletoken;

所以这会产生类似输出

的内容
09821f0ae9bdee372b344b0921582f2e7a3a0587a3b55bb247f200381e92ffd41480e8619b3d575214a7a25c3a9d0f618c6733bed6830ee7b66136b85f8d7568

但我只想要前40个字符

09821f0ae9bdee372b344b0921582f2e7a3a0587

谢谢,希望我清楚自己

3 个答案:

答案 0 :(得分:3)

$profiletoken = hash("sha512", $salt . $user . $id . $value);
$shortToken = substr($profiletoken, 0, 40);

但我问你的问题是为什么你要把它缩短到40个字符?这种做法违背了使用SHA512的意义,SHA512产生128个字符。对于SHA512,您可以将其作为CHAR(128)存储在数据库中。

$profiletoken = hash("sha1", $salt . $user . $id . $value);
echo $profiletoken; // 40 characters long

编辑1:不要使用SHA1,它不安全。

编辑2:对于想要阅读有关截断哈希主题的更多信息的人,我在密码交换中询问了它,并且它已成为一个非常受欢迎的问题:

Is truncating a SHA512 hash to the first 160 bits as secure as using SHA1?

答案 1 :(得分:2)

substr就是你所需要的。

echo substr($profiletoken, 0 ,40);

如果你只是使用它来生成一个唯一的令牌来跟踪你可能想要使用uniqid查看的游戏状态,或者你是否将状态保存到文件系统tempnam

答案 2 :(得分:0)

如果没有足够的空间来输出sha512,请使用较小的哈希:

sha1($profileToken);

对sha512的输出执行substr()会降低其效率,而您只是在此过程中浪费CPU周期。