【发布时间】:2023-04-06 00:52:01
【问题描述】:
我有这个问题,如果不合适,请在 cmets 中告诉我,我会放弃它。事情是这样的: 我用这段代码生成盐:
$salt = mcrypt_create_iv(32);
密码是这样的:
$password = hash('sha256', $_POST['password'] . $salt);
并将$salt和$password保存到MYSQL数据库中,目前没有问题,如果我这样连接:
$pdo = new PDO(
'mysql:host=hostname;dbname=defaultDbName',
'username',
'password'
);
但如果我以其他方式连接:
$pdo = new PDO(
'mysql:host=hostname;dbname=defaultDbName;charset=utf8',
'username',
'password'
);
盐没有保存到数据库中或以错误的值和长度保存;除非我这样做: $salt = utf8_encode(mcrypt_create_iv(32);); 但我认为这是不对的,我的意思是为什么我应该编码, mcrypt_create_iv(32) 和 utf-8 有什么问题?
【问题讨论】:
-
您的 IV 将基本上是“随机”的二进制垃圾。如果您将其放入 text/varchar 字段,它将受该字段的字符集翻译规则的约束。二进制数据应该进入 varbinary/blob 字段。这些都没有字符集,你投入的领域将是它的结果。
-
因此,将字段的提示更改为 blob 将使其与连接的字符集无关,这就是您的意思
-
这就是二进制/blob 字段的意义所在。由于翻译规则的应用不正确,因此没有字符集随机丢弃数据,而这些规则一开始就不应该应用于数据。