2

这种盐弄乱了我的 SELECT 命令:

p‚ÙÕ†¤éÿ5xÃø¤ü¥–ä™m›|§Éá\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);

问题:用户 2 的行在选择“盐”时永远不会显示。任何人为什么? 相关问题: User3 也有换行符,这有点把我的表弄乱了,可能和上面的问题一样。

我尝试过的没有运气: 我用“mysql”结尾的每个单词都用谷歌搜索了。我什么都没找到。。

谢谢。

4

2 回答 2

1

看起来您可以使用该hex函数查询二进制列,它会为您提供字节的十六进制表示,这不会影响您的输出:

select userid, username, hex(salt) from user;

链接到 MySQL 二进制文档

于 2013-07-05T18:52:38.413 回答
0

实际上,在 MySql 数据库中存储和检索二进制数据应该没有问题。只要确保为所需的目标系统正确地转义它。这表示:

要将二进制字符串存储在 MySql 数据库中,您需要一个 INSERT 查询。mysqli_real_escape_string()在将二进制字符串添加到查询之前转义二进制字符串,或使用参数化查询。顺便说一句,不推荐使用 mysql_* 函数,您应该切换到 mysqli_* 函数或 PDO。

从数据库中读取字符串时,您将取回原始未转义的二进制字符串。要显示此字符串,您需要将其转义以输出 HTML,该函数htmlspecialchars()是一个不错的选择。

您似乎在某种类型的控制台中给出了结果,这取决于这是否是您自己的代码正在运行,您可以为这种类型的输出正确转义它,或者您只需记住您看到的不是您所看到的得到。phpMyAdmin 工具通过给出文本来规避这个问题[BLOB - 32Bytes]

快速说明:如果您需要盐来对密码进行哈希处理,那么使用 BCrypt 之类的算法可以让您的生活更轻松。然后PHP 自己的实现password_hash()将在哈希值本身中包含特定于密码的盐,然后您可以不使用特定于用户的盐。

于 2013-07-06T06:23:17.237 回答