我使用下面的代码在PHP中创建salt。
$length=100;
$bool=true;
$salt=openssl_random_pseudo_bytes ( $length, $bool );
当我回显该值时,它显示该值(一个实例)
×YOEú ßPŽžJZýr³€žYM½N±~ÄŽ¼D‚ÝÆFÕ`O$I$îÇF üKøäƒþ¥_5ûù„Ð… Ïq®ùä. ³æ¤ljî¬}Të‚´ùB#3U96
但是在存储到数据库中时,它会变为
Ñx€gþ‚΀³€Œ¯´N§Å·.:gºÈá•ïjÇÖ…áf6uIùYbx}û€·iÀ0èFšDö¼6¥qzMéÁi‡±
该字段使用latin1_swedish_ci编码。
答案 0 :(得分:2)
openssl_random_pseudo_bytes
返回一个原始字节流。它不返回旨在可读的“字符”。这些字节如何显示为字符完全取决于口译方;在这里,很明显MySQL用不同的编码来解释字节,而不是从PHP中显示它的浏览器/控制台。
如果你在MySQL中存储这些字节,你应该将它们存储在BLOB类型列中,因为它们是无意义的blob。
如果要将它们视为字符,则需要对它们进行编码。最好的可能是简单的bin2hex($salt)
,它将二进制数据编码为十六进制。或者使用base64_encode
。
其次,openssl_random_pseudo_bytes
的第二个参数不应该作为布尔值传递。它是一个pass-by-reference变量,允许您在事件之后检查是否生成了具有强安全性的字节:
$salt = openssl_random_pseudo_bytes($length, $strong);
if ($strong) {
// $salt is strong
} else {
// $salt is weak
}