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

Php 如何将我的令牌缩短为40个字符的哈希sha512?,php,Php,为了简单起见,我只想回显sha512的前40个字符 $salt = "fRY^YXCH%^ER^*&^"; $profiletoken = hash("sha512", $salt . $user . $id . $value); echo $profiletoken; 因此,这将产生类似这样的输出 09821f0ae9bdee372b344b0921582f2e7a3a0587a3b55bb247f200381e92ffd41480e8619b3d575214a7a25c3a9d0f

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

$salt = "fRY^YXCH%^ER^*&^";
$profiletoken = hash("sha512", $salt . $user . $id . $value);
echo $profiletoken;
因此,这将产生类似这样的输出

09821f0ae9bdee372b344b0921582f2e7a3a0587a3b55bb247f200381e92ffd41480e8619b3d575214a7a25c3a9d0f618c6733bed6830ee7b66136b85f8d7568
但我只想要前40个字符

09821f0ae9bdee372b344b0921582f2e7a3a0587

谢谢并希望我能把我的话说清楚

substr就是你所需要的一切

echo substr($profiletoken, 0 ,40);
如果您只是使用它来生成一个唯一的令牌来跟踪游戏状态,那么您可能希望使用uniqid或者将状态保存到文件系统tempnam

$profiletoken = hash("sha512", $salt . $user . $id . $value);
$shortToken = substr($profiletoken, 0, 40);
但我想问你的是,为什么要把它缩短到40个字符?这样就破坏了使用SHA512的目的,SHA512产生128个字符。对于SHA512,可以将其作为CHAR(128)存储在数据库中


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

编辑2:对于任何想阅读更多有关截断散列主题的人,我在加密交换上询问了这一问题,此后它成为了一个非常流行的问题:


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

sha1($profileToken);

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

我想substr还可以用于其他用途,但非常感谢它的有效性:)一个问题:为什么?这违背了整个目的,您可能只使用
sha1()
,它将为您提供长度为40的有效哈希。的确,但当您将其截断为40时,您只会将其销毁。无论是谁对这个问题进行了投票,请解释一下?我不是密码学家,但更明确地说,其他人所表达的担忧是:当你截断散列时,你显然创造了许多潜在的情况,在这些情况下,不同的消息在全长上会产生不同的散列,现在会产生相同的散列。理论上,在任何一种情况下,40个字符都可以支持固定数量的多样性,而无需重复哈希,但由于
sha512()
旨在生成给定长度的有效哈希,因此该哈希的任何给定40个字符子集都不一定像
sha1()那样安全
--情况可能更糟。它只是在执行任何操作之前识别用户的配置文件,一旦值发生变化,它就会发生变化。这是我正在处理的一个游戏,因此所有配置文件都需要标识为identity:),而我不会将其保存到数据库中token@deerox如果你找到两个相同的代币,我不会感到惊讶。请注意,sha512不是设计为被截断的。使用它要自担风险。@deerox你在评论你原来的帖子时说“sha512是我的最爱,我使用它时感觉更安全”,但这毫无意义。通过将其减少到40个字符,您将失去安全性。SHA1字符串并不总是唯一的。不能将任意数量的数据放入固定的字节数中。无论如何,请参见Crypto.SE。不过,有一点不同,因为SHA-1已经被证明有弱点,并且SHA是为子字符串设计的,以确保安全。()这并不重要……有趣的是,你是说sha512的160位子集比sha1强?也许吧,但因为deerox说这是为了识别配置文件,我认为SHA-1的任何潜在问题都不适用,也不值得担心。如果是的话,一个完整的SHA-512会更好,当然…
sha1($profileToken);