如何将我的代币缩短为哈希sha512的40个字符


How I can short my token to 40 characters of hash sha512?

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

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

所以这会产生类似这样的输出

09821f0ae9bdee372b344b0921582f2e7a3a0587a3b55bb247f200381e92ffd41480e8619b3d575214a7a25c3a9d0f618c6733bed6830ee7b66136b85f8d7568

但我只想要前40个字符

09821f0ae9bdee372b344b0921582f2e7a3a0587

谢谢,希望我能自我澄清

$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:对于任何想阅读更多关于截断哈希主题的人,我在Cryptography Exchange上询问了这个问题,从那以后,它就成了一个非常流行的问题:

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

substr就是您所需要的全部。

echo substr($profiletoken, 0 ,40);

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

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

sha1($profileToken);

对sha512的输出执行substr()会降低其有效性,并且在这个过程中只会浪费CPU周期。