Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中加密安全的随机ASCII字符串_Php_Security_Random_Cryptography - Fatal编程技术网

PHP中加密安全的随机ASCII字符串

PHP中加密安全的随机ASCII字符串,php,security,random,cryptography,Php,Security,Random,Cryptography,我知道PHP7中的random_bytes(),我想用它生成一个加密安全(例如难以猜测)的随机字符串,用作一次性令牌或在cookie中长期存储 不幸的是,我不知道如何将random_bytes()的输出转换为仅由人类可读字符组成的字符串,因此浏览器不会感到困惑。我知道bin2hex(),但我更喜欢使用完整的ASCII范围,而不是十六进制数,因为每个长度有更多的位 有什么想法吗?我个人只是使用一个GUID库并连接两个GUID以获得一个长的唯一令牌字符串。您还可以选择删除破折号以使了解源代码变得更加

我知道PHP7中的
random_bytes()
,我想用它生成一个加密安全(例如难以猜测)的随机字符串,用作一次性令牌或在cookie中长期存储

不幸的是,我不知道如何将
random_bytes()
的输出转换为仅由人类可读字符组成的字符串,因此浏览器不会感到困惑。我知道
bin2hex()
,但我更喜欢使用完整的ASCII范围,而不是十六进制数,因为每个长度有更多的位


有什么想法吗?

我个人只是使用一个GUID库并连接两个GUID以获得一个长的唯一令牌字符串。您还可以选择删除破折号以使了解源代码变得更加困难,如果您想使其更加复杂,您可以将字符串随机减少最多10个字符,以增加未知长度的复杂性

我使用这个库来生成我的guid

抱歉,我忽略了关于你想使用26个字母字符和数字字符的完整范围的部分。。。我不确定我在这方面是否有答案,但你应该相信猜测UUID4的难度,特别是当你将两个UUID4加在一起并将长度模糊10倍以使猜测更加复杂时

实际上,如果您可以在有效的ascii字符代码范围内安全地生成一个随机数数组,那么您可以将整个随机代码数组转换为相应的ascii字符,并将它们作为单个字符串一起内爆

function randomAsciiString($length) {
    return implode('', array_map(
        function($value) {
            return chr($value);
        },
        array_map(
            function($value) {
                return random_int(33, 126);
            },
            array_fill(0, $length - 1, null)
        )
    ));
}
echo randomAsciiString(128);                  // Normal 128 char string
echo randomAsciiString(random_int(118, 128)); // obfuscated length char string for extra complexity.

当然,尽管。。。您应该注意,您使用的是键盘上的所有标准键,其中一些字符会打乱敏感的内容(例如引号等)

我个人只使用一个GUID库并连接两个GUID以获得一个长的唯一标记字符串。您还可以选择删除破折号以使了解源代码变得更加困难,如果您想使其更加复杂,您可以将字符串随机减少最多10个字符,以增加未知长度的复杂性

我使用这个库来生成我的guid

抱歉,我忽略了关于你想使用26个字母字符和数字字符的完整范围的部分。。。我不确定我在这方面是否有答案,但你应该相信猜测UUID4的难度,特别是当你将两个UUID4加在一起并将长度模糊10倍以使猜测更加复杂时

实际上,如果您可以在有效的ascii字符代码范围内安全地生成一个随机数数组,那么您可以将整个随机代码数组转换为相应的ascii字符,并将它们作为单个字符串一起内爆

function randomAsciiString($length) {
    return implode('', array_map(
        function($value) {
            return chr($value);
        },
        array_map(
            function($value) {
                return random_int(33, 126);
            },
            array_fill(0, $length - 1, null)
        )
    ));
}
echo randomAsciiString(128);                  // Normal 128 char string
echo randomAsciiString(random_int(118, 128)); // obfuscated length char string for extra complexity.

当然,尽管。。。你应该注意,你使用的是键盘上所有的标准键,其中一些字符会打乱敏感的东西(如引号等)

不幸的是,Peter O.在评论队列中受到负面关注后删除了他的答案,可能是因为他将其表述为一个问题。我相信这是一个合理的答案,所以我会重印它


一个简单的解决方案是使用
base64\u encode()
将随机数据编码到字母表中。这将不会产生您所要求的“完整ASCII范围”,但它将为您提供大部分。更大的ASCII范围由合适的base85编码器输出,但php没有内置的。不过,您可能会发现很多用于php的开源base85编码器。在我看来,base85的长度比base64的长度减少不太值得您维护额外的代码。

不幸的是,Peter O.在评论队列中受到负面关注后删除了他的答案,可能是因为他将其表述为一个问题。我相信这是一个合理的答案,所以我会重印它


一个简单的解决方案是使用
base64\u encode()
将随机数据编码到字母表中。这将不会产生您所要求的“完整ASCII范围”,但它将为您提供大部分。更大的ASCII范围由合适的base85编码器输出,但php没有内置的。不过,您可能会发现很多用于php的开源base85编码器。在我看来,Base85在Base64上的长度的减少不值得额外的代码来维护。

让我们考虑使用的字母。为了简单起见,我假设您只打算使用大小英文字母。这意味着您有26个大字母和26个小字母,52个不同的可能值。如果我们把N个元素的字节数组看作是基256中的N个数字,我们把这个数转换成一个基52的数字,其中A是0,B是1,C是2,…,A是26,…,Z是51,然后把这些数字转换成相应的字母将产生你想要的文本。为了简单起见,我假设您只打算使用大小英文字母。这意味着您有26个大字母和26个小字母,52个不同的可能值。如果我们将n个元素的字节数组视为以256为基数的n个数字,并将该数字转换为以52为基数的数字,其中a为0,B为1,C为2,…,a为26,…,z为51,那么将这些数字转换为相应的字母将产生您想要的文本。

“…但您应该相信猜测UUID4的难度…”不,你不应该。为什么你不相信它能生成一个随机的字符串,而人们却很难猜到呢?我们都知道,有足够的时间、处理能力和机会来戳戳我们最终会猜对的东西。。。所以从技术上讲,密码学中没有什么是安全的,但是如果你有很强的机会,某些东西不会被猜到,那么你可以将其应用到一个设计良好的系统中,在奶牛回家之前不允许有时间戳它