PHP mcrypt_create_iv 返回问号和不正确的长度 - CodeIgniter

Posted

技术标签:

【中文标题】PHP mcrypt_create_iv 返回问号和不正确的长度 - CodeIgniter【英文标题】:PHP mcrypt_create_iv returns question marks and incorrect length - CodeIgniter 【发布时间】:2013-12-18 09:47:31 【问题描述】:

我正在尝试使用mcrypt_create_iv 生成随机盐。当我测试是否通过回显它来生成盐时,它会检查出来,但它不是我作为参数传递给它的所需长度 (32),而是小于那个。

但是,当我将它存储在我的数据库表中时,它会显示为 K??5P?M???4?o???"?0??

我确定这与数据库有关,但我尝试将其排序规则更改为与 CI 的配置设置相对应,即 utf8_general_ci,但这并没有解决问题,而是生成了一个小得多的盐。

有谁知道可能出了什么问题?感谢您的任何反馈/帮助

【问题讨论】:

我刚刚将 CodeIgniters db 配置中的 char_set 设置更改为 latin1;它似乎产生了一个好的盐,但我会尝试登录并报告 PS:既然我已经将 char_set 设置为 latin1,那么当我查询数据库时,我的其他表会有什么副作用吗? 将字符集设置为 latin1 似乎搞砸了将日期插入数据库的过程。知道为什么吗? 【参考方案1】:

函数mcrypt_create_iv() 将返回一个二进制字符串,其中包含\0 和其他不可读的字符。根据您希望如何使用盐,您首先必须将这些字节字符串编码 为可接受的字母表。也可以在数据库中存储二进制字符串,但是显示它们当然会有问题。

由于盐通常用于密码存储,我建议查看 php 的函数 password_hash(),它会自动生成盐并将其包含在生成的哈希值中,因此您不需要单独的salt 的数据库字段。

【讨论】:

是的,我知道 password_hash 函数,但它只在 PHP5.5 中可用。我正在使用 WAMP,因此尚不支持我升级 您如何看待将我的数据库表中的列数据类型更改为 binary/varbinary,而不是 varchar?会不会影响编解码?我正在使用 hash() 函数来加密/解密用户密码以及他们的 salt @a7omiton - 函数 password_hash() 还存在一个 compatibility pack。如果这不是一个选项,您可以查看我的example code,它会生成 BCrypt 盐。这取决于你想用盐做什么,如果你需要它用于BCrypt,那么你不应该将它单独存储在数据库中,只需查看示例即可。 谢谢,我正在查看它。如果我包含了兼容性包,我是否可以像 PHP 手册中写的那样使用它,或者有什么注意事项? @a7omiton - 兼容包的功能可以完全一样的使用,都是同一个作者写的。它们在内部并不完全相同,但您将能够删除兼容包并且您的代码应该仍然可以工作,它们是“面向未来的”。

以上是关于PHP mcrypt_create_iv 返回问号和不正确的长度 - CodeIgniter的主要内容,如果未能解决你的问题,请参考以下文章

PHP 7.3 中的 mcrypt_create_iv 替代方案 [重复]

PHP - 用 openssl_random_pseudo_bytes() 替换 mcrypt_create_iv()

在 PHP 中读取 CSV 文件返回黑色菱形问号

PHP执行SQL并将返回数据显示到网页上为啥汉字会变成问号

在php中沉默E_DEPRECATED

找不到 mcrypt => 调用未定义的函数 Laravel\mcrypt_create_iv()