这个盐弄乱了我的SELECT命令:
p,ÙÕ†¤éÿ5xÃø¤ü¥-a™米> |§Éá\0yå-E
解码输出:
p‚ÙÕ†¤éÿ5xÃø¤ü¥–ä™m›|§Éá\0yå–e
没有盐:
mysql> SELECT userid, username FROM user;
+--------+--------------+
| userid | username |
+--------+--------------+
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
+--------+--------------+
4 rows in set (0.00 sec)
有盐:
mysql> SELECT userid, username, salt FROM user;
+--------+--------------+----------------------------------+
| userid | username | salt |
+--------+--------------+----------------------------------+
| 1 | user1 | ]ææ=°ù¡£YÒp£'Rm§Éá yåe | |
| 3 | user2 | ¸ÀçqµgsN\ôü¥ä
ɪÓñ1r¦ôyr$ÅK |
| 4 | user4 | \7øþ ÇãÙr|ú&eå¡%»
yYRìÚ¬E |
+--------+--------------+----------------------------------+
4 rows in set (0.00 sec)
我用来生成盐的功能:
$ salt = mcrypt_create_iv(32,MCRYPT_DEV_RANDOM);
逃脱:
$ salt = mysql_real_escape_string($ salt);
问题:选择'salt'时,从不显示User2的行。有人为什么? 相关问题: User3也有换行符,这有点搞乱我的表,可能和上面的问题一样。
我试过没有运气: 我用Google的“mysql”结尾搜索每个单词。我什么都没发现..
感谢。
答案 0 :(得分:1)
看起来您可以使用hex
函数查询二进制列,它会为您提供字节的十六进制表示,这不会让您的输出变得很糟糕:
select userid, username, hex(salt) from user;
答案 1 :(得分:0)
实际上,在MySql数据库中存储和检索二进制数据应该没问题。只需确保为所需的目标系统正确地逃脱它。这意味着:
要将二进制字符串存储在MySql数据库中,需要INSERT查询。在将二进制字符串添加到查询之前,使用mysqli_real_escape_string()
转义二进制字符串,或使用参数化查询。 BTW mysql_ *函数已弃用,您应该切换到mysqli_ *函数或PDO。
从数据库中读取字符串时,您将返回原始未转义的二进制字符串。要显示此字符串,您需要将其转义为HTML输出,然后函数htmlspecialchars()
是一个不错的选择。
你似乎在某种类型的控制台中给出结果,这取决于这是否是你自己的代码运行,你可以正确地为这种类型的输出转义它,或者你只需要记住你所看到的是不是你得到的。 phpMyAdmin工具通过发出文本[BLOB - 32Bytes]
来解决这个问题。
快速说明:如果您需要使用盐来进行散列密码,那么使用像BCrypt这样的算法可以让您的生活更轻松。然后,PHP自己的实现password_hash()将在哈希值本身中包含密码特定的盐,然后您就可以在没有用户特定的盐的情况下使用。