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

Php 在mysql数据库中存储值时的盐变化值,php,mysql,passwords,salt,Php,Mysql,Passwords,Salt,我使用下面的代码在PHP中创建salt $length=100; $bool=true; $salt=openssl_random_pseudo_bytes ( $length, $bool ); 当我回显该值时,它会显示该值(一个实例) 但在数据库中存储时,它会被更改为 Ñx€gþ‚΀³€Œ¯´N§Å·.:gºÈá•ïjÇÖ…áf6uIùYbx}û€·iÀ0èFšDö¼6¥qzMéÁi‡± 该字段使用拉丁1_瑞典_ci编码 openssl\u random\u pseudo\u by

我使用下面的代码在PHP中创建salt

$length=100;
$bool=true;
$salt=openssl_random_pseudo_bytes ( $length, $bool );
当我回显该值时,它会显示该值(一个实例)

但在数据库中存储时,它会被更改为

Ñx€gþ‚΀³€Œ¯´N§Å·.:gºÈá•ïjÇÖ…áf6uIùYbx}û€·iÀ0èFšDö¼6¥qzMéÁi‡±
该字段使用拉丁1_瑞典_ci编码


openssl\u random\u pseudo\u bytes
返回一个原始字节流,顾名思义。它不会返回用于可读的“字符”。这些字节如何显示为字符完全取决于解释方;这里很明显MySQL是用不同的编码来解释字节的,而不是从PHP显示字节的浏览器/控制台

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

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

其次,
openssl\u random\u pseudo\u bytes
的第二个参数不应作为布尔值传递。这是一个pass-by-reference变量,允许您在生成字节后检查字节是否具有很强的安全性:

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

字段类型是varchar吗?是的,我甚至添加了一个指向图像显示表结构的链接。好的,尝试将类型更改为blobNope仍然不同。编码类型是否有任何问题。将编码更改为utf8会有帮助吗?我不这么认为,但是如果您想将salt存储在db中,然后选择它,您可以将其存储为base64 encodedThanks以获取详细解释。
$salt = openssl_random_pseudo_bytes($length, $strong);
if ($strong) {
    // $salt is strong
} else {
    // $salt is weak
}