盐的值在mysql数据库中的存储值变化

时间:2014-07-17 10:27:16

标签: php mysql passwords salt

我使用下面的代码在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编码。

signup script

script containing hashing function, salt generator

table structure

1 个答案:

答案 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
}