-4

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

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

所以这将给出类似这样的输出

09821f0ae9bdee372b344b0921582f2e7a3a0587a3b55bb247f200381e92ffd41480e8619b3d575214a7a25c3a9d0f618c6733bed6830ee7b66136b85f8d7568

但我只想要前 40 个字符

09821f0ae9bdee372b344b0921582f2e7a3a0587

谢谢,希望我说清楚了

4

3 回答 3

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

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

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

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

编辑 2:对于任何想了解更多关于截断哈希的主题的人,我在 Cryptography Exchange 上询问过它,它已经成为一个非常受欢迎的问题:

将 SHA512 哈希截断到前 160 位是否与使用 SHA1 一样安全?

于 2013-07-10T15:05:17.253 回答
2

substr 就是你所需要的。

echo substr($profiletoken, 0 ,40);

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

于 2013-07-10T15:04:41.400 回答
0

如果您没有足够的空间用于 sha512 的输出,请使用较小的散列:

sha1($profileToken);

对sha512substr()的输出进行操作会降低其有效性,并且您只是在此过程中浪费 CPU 周期。

于 2013-07-10T15:22:26.037 回答