【发布时间】:2014-03-17 07:45:58
【问题描述】:
openssl_encrypt 函数状态的 PHP 文档
string openssl_encrypt ( string $data , string $method , string $password [, int $options = 0 [, string $iv = "" ]])
谁能帮我理解名为$password 的参数是什么?
答案可能包括对这个想法的确认或拒绝,除了命名为$password 之外,该参数确实被用作加密的密钥。
openssl_encrypt 的密码参数是什么?它是密码字符串(仅包含可打印字符)还是密钥(包含不可打印字符和 ASCII-Z 终止符)?
说明
我被 PHP 的 openssl_encrypt 文档困住了。作为一个好人并尝试做“RTM”,我对恕我直言不满意的文档没有多大意义。
问题在于,对我来说,password 和 key 在加密方面是有区别的。密钥直接是用于加密的 参数,因此必须具有特定大小 - “密钥长度” - 即 128/256/512 位,具体取决于所需的密码和密钥长度。另一方面,password 是我理解的通过键盘输入的人类可读字符串,其长度可能不同,并且在用于加密之前首先转换为 key .
因此示意图上的区别:
- 密码=>密钥=>加密
- 密钥 => 加密
不幸的是,在 PHP openssl_encrypt documentation 中我找不到任何关于如何使用 key 的信息。唯一建议的是参数“密码”。
谁能给我一个胶水如何使用钥匙? 当然,我不想输入密钥作为密码参数,因为我希望在加密中使用特定的 key。我确实不希望这个 key 被简单地误解为一个参数,并用作另一个从我的“被误认为密码的密钥”计算出来的密钥。
此外,谜团还在继续查看有关同一 openssl_encrypt 函数中的初始化向量参数的文档。它简单地说:
iv 非 NULL 初始化向量。 并且 iv 应该是一个字符串。鉴于 iv 通常是一定长度的二进制数据,例如一个以 \0 结尾的字符串(十六进制 0x00)可能会出现在里面,我很困惑需要什么格式。
本质上,我觉得自己很孤单,PHP 文档也声明了
警告此功能目前没有记录;只有它的论点 列表可用。
更新
我做了一些测试,并“尝试”以帮助我弄清楚 password 参数是什么。
使用此代码:
$pass="0123456789abcdefghijklmnob";
$iv="0123456789abcdef";
echo "using $pass results:\n";
echo openssl_encrypt("test secret string", 'aes-128-cbc', $pass,NULL,$iv);
我得到这个结果:
using 0123456789abcdefghijklmnob results:
XjEeaLucY38Y6XEUceYMYKTebR4kOp3s727ipMl5KNc=
然后改变“密码”参数的长度:
$pass="0123456789abcdefg"; //hijklmnob";
$iv="0123456789abcdef";
echo "using $pass results:\n";
echo openssl_encrypt("test secret string", 'aes-128-cbc', $pass,NULL,$iv);
我仍然得到相同的加密代码:
using 0123456789abcdefg results:
XjEeaLucY38Y6XEUceYMYKTebR4kOp3s727ipMl5KNc
似乎通过测试而不是通过被文档告知 密码确实只考虑到前 16 个字节,这似乎是密钥的 128 位。
让我害怕的是,在如此敏感的功能(用于加密)中,文档很糟糕,甚至没有警告过度输入一个记录不充分的参数。我也非常相信 password 应该被命名为 key 因为这 16 个字节似乎直接代表了密钥。
【问题讨论】:
-
@noloader 辱骂?真的吗?同意我不高兴 PHP 文档不够完美,但我是否使用了粗俗的语言?无论如何,感谢您提出突出问题的建议!
-
确实,文档还有一些不足之处。您应该针对该项目提交一个文档错误,以便为未来的读者澄清它。
标签: php encryption parameters