【问题标题】:value of salt changing on storing value in mysql database在 mysql 数据库中存储值时盐值的变化
【发布时间】:2014-09-08 04:17:14
【问题描述】:

我正在使用下面的代码在 PHP 中创建盐。

$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

【问题讨论】:

  • 字段类型是 varchar 吗?
  • 是的,我什至添加了一个指向图像显示表格结构的链接。
  • 好的,试试把类型改成blob
  • 不一样。编码类型有问题吗。将编码更改为 utf8 会有帮助吗?
  • 我不这么认为,但是如果你想将salt存储在db中,然后选择它,你可以存储它base64编码

标签: php mysql passwords salt


【解决方案1】:

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
}

【讨论】:

  • 感谢您的详细解释。
猜你喜欢
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 2012-11-26
相关资源
最近更新 更多