生成加密安全令牌

2022-08-30 07:57:46

为了生成一个32个字符的令牌来访问我们的API,我们目前使用:

$token = md5(uniqid(mt_rand(), true));

我已经读到这种方法在加密上是不安全的,因为它基于系统时钟,这将是一个更好的解决方案,因为它更难预测。openssl_random_pseudo_bytes

如果是这种情况,等效代码会是什么样子?

我推测这样的事情,但我不知道这是否正确......

$token = md5(openssl_random_pseudo_bytes(32));

另外,我应该传递给函数的长度是有意义的?


答案 1

这是正确的解决方案:

$token = bin2hex(openssl_random_pseudo_bytes(16));

# or in php7
$token = bin2hex(random_bytes(16));

答案 2

如果你想使用openssl_random_pseudo_bytes最好使用CrytoLib的实现,这将允许你生成所有字母数字字符,将bin2hex粘贴openssl_random_pseudo_bytes只会导致你得到A-F(大写字母)和数字。

将 path/to/ 替换为放置 cryptolib.php 文件的位置(您可以在 GitHub 上找到它:https://github.com/IcyApril/CryptoLib)

<?php
  require_once('path/to/cryptolib.php');
  $token = IcyApril\CryptoLib::randomString(16);
?>

完整的CryptoLib文档可在以下位置获得:https://cryptolib.ju.je/。它涵盖了许多其他随机方法,级联加密和哈希生成和验证;但如果你需要它,它就在那里。


推荐