得到了几个相互关联的问题......它是关于密钥用于加密。使用PHP/openssl为AES-CBC-256生成32字节密钥(256位),以便在openssl_encrypt
函数中使用。openssl随机伪字节和具有小写字符的bin2hex
按我的理解,我可以创造一个32字节的字符串,用下面的PHP函数:
$key = openssl_random_pseudo_bytes(32, true);
第一个问题,它会输出奇怪的字符(我的字符集UTF8),关键是正确使用这些奇怪的人物?是否有效使用的关键?
输出示例:
O�3sa��TX|~�!�Q8�]M�r��{���?��
如果我将每个这些字符的二进制数字,我得到:
01001111 10110001 00110011 01110011 01100001 10111111 11011101 01010100 01011000 01111100 01111110 11101010 00100001 10001011 01010001 00001110 00111000 10111101 01011101 01001101 10100000 01110010 10101001 11001100 01111011 10110001 11010011 11110001 00111111 00000110 11000110 11001011
所以它似乎是正确的,我得到了32×8位= 256位密钥...
第二个问题,是密钥应该被hex'ed的原因之一,因为它可以输出未知的字符......这种方式使它更易读,也用于存储?
$ key_hex = bin2hex($ key);
输出:
4fb1337361bfdd54587c7eea218b510e38bd5d4da072a9cc7bb1d3f13f06c6cb
第三个问题,如果我读到HEX它说,它仅包含
0-9
和A-F
,为何会出现小写字符在bin2hex
(PHP)上面的输出?是否安全,然后做
strtoupper()
所以都得到大写字符,因为它应该?如果我把第二个字符(未知的)从原始密钥,这是十六进制B1(B1),即二进制位:
10110001
我确实发现了B1为
1011 0001
,但似乎是包含2个或更多字节的字符的一部分......这可能是我将其视为未知字符的原因吗?因为它只是一个随机的8位...也许我错过了一些拼图在这里得到整体图片......但我认为一般来说钥匙应该罚款,它可以hex'ed和uppercased也可用于
openssl_encrypt
。而只是希望可以肯定,我不会让任何这方面的错误,这就是为什么我在这里张贴这...如果有人可以证实这一点。
谢谢
一般来说,答案是“是”:)请注意,您可以生成任何字符编码,包括无效字符编码。它取决于PHP中使用的默认字符编码。你得到的是一个八位字符串(或字节数组),而不是一个字符串,但由于PHP不是强类型的,它可以用作任何一种。 –
你误解了第二个参数。它对函数的结果没有影响。你传入一个像'$ cryptoStrong'这样的变量,函数将通过reference_设置该变量的值。然后您可以检查该值以查看字节生成是否具有密码强度。 – Madbreaks