2014-07-17 113 views
2

我正在使用下面的代码在PHP中创建salt。在mysql数据库中存储值变化的盐值

$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

+0

是字段类型varchar? –

+0

是的,我甚至添加了图像显示表结构的链接。 – user3263192

+1

好吧,尝试将类型更改为blob –

回答

2

openssl_random_pseudo_bytes返回原始字节流,顾名思义。它不会返回旨在可读的“字符”。如何将这些字节显示为字符,完全取决于口译方;这里很明显,MySQL正在用不同的编码解释字节,而不是使用PHP显示的浏览器/控制台。

如果你在MySQL中存储这些字节,你应该将它们存储在一个BLOB类型的列中,因为它们是一个无意义的blob。

如果您想将它们视为字符,则需要对它们进行编码。最好的可能是简单的bin2hex($salt),它将二进制数据编码为十六进制。或者使用base64_encode

其次,openssl_random_pseudo_bytes的第二个参数不应该作为布尔值传递。这是一个传递参考变量,它允许您检查事实之后字节是否具有强安全性生成:

$salt = openssl_random_pseudo_bytes($length, $strong); 
if ($strong) { 
    // $salt is strong 
} else { 
    // $salt is weak 
} 
+0

感谢您的详细解释。 – user3263192