hum*_*ace 4 php encryption parameters
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"我对imho不满意的文档我没有多大意义.
问题是,对于我来说,密码和密钥在加密方面存在差异.密钥直接是用于加密的参数,因此必须具有特定大小 - "密钥长度" - 即128/256/512位,具体取决于所需的密码和密钥长度.甲密码另一方面是通过其可以在差为任何长度和键盘输入的一个我的理解人类可读串正在使用第一加密转换成前键.
因此示意性差异:
不幸的是在PHP openssl_encrypt文档中我找不到任何关于如何使用密钥的信息.唯一建议的是参数"密码".
任何人都可以给我一个胶水如何使用钥匙?当然我不想输入密钥作为密码参数,因为我想要一个特定的密钥用于加密.我不希望这个密钥被简单地误解为参数,并且用于从我的"密钥误认为密码"计算的另一个密钥.
此外,该错误继续查看关于同一openssl_encrypt函数中的初始化向量参数的文档.它只是声明:
iv非NULL初始化向量.那个iv应该是一个字符串.鉴于iv通常是一定长度的二进制数据,例如字符串终止\ 0(十六进制0x00)可能在内部发生,我感到困惑的是什么格式是需要的.
从本质上讲,我对PHP文档也非常感兴趣
警告此功能目前未记录; 只有它的参数列表可用.
我做了一些测试,并"试着"帮我弄清楚密码参数是什么.
使用此代码:
$pass="0123456789abcdefghijklmnob";
$iv="0123456789abcdef";
echo "using $pass results:\n";
echo openssl_encrypt("test secret string", 'aes-128-cbc', $pass,NULL,$iv);
Run Code Online (Sandbox Code Playgroud)
我得到这个结果:
using 0123456789abcdefghijklmnob results:
XjEeaLucY38Y6XEUceYMYKTebR4kOp3s727ipMl5KNc=
Run Code Online (Sandbox Code Playgroud)
然后更改" 密码 "参数的长度:
$pass="0123456789abcdefg"; //hijklmnob";
$iv="0123456789abcdef";
echo "using $pass results:\n";
echo openssl_encrypt("test secret string", 'aes-128-cbc', $pass,NULL,$iv);
Run Code Online (Sandbox Code Playgroud)
我仍然得到相同的加密代码:
using 0123456789abcdefg results:
XjEeaLucY38Y6XEUceYMYKTebR4kOp3s727ipMl5KNc
Run Code Online (Sandbox Code Playgroud)
似乎通过测试而不是通过文档通知密码确实只被考虑到前16个字节,这似乎是128位,这将是关键.
令我感到害怕的是,在这样一个敏感的函数(用于加密)中,文档很糟糕,并且甚至没有警告过多输入一个记录不完整的参数.此外,我相信密码应该被命名为密钥,因为它似乎直接代表密钥.
该$password参数确实是关键.密钥大小取决于您使用的AES模式(如您所知).
正如您在更新中所述,对于AES-128,只有前16个字符/字节计为密钥.对于AES-256,它将是前32个字符.
当使用openssl_encrypt()和openssl_decrypt()函数时,可以简单地为$password/ key参数传递32个字符的人类可读密码.
例如,我输入的密码参数可能是 $password = "This is 32 characters long......";
大多数人不喜欢写一个固定长度的明文密码,因此他们可能会计算一个哈希并将其截断为正确的长度.他们会使用此哈希作为加密密钥/密码.
例如,我可以计算我想要的任何长度的密码/短语的MD5哈希值,然后将其用作我的AES密码/密钥:
$plaintextPass = 'This is my password. This password is not exactly 32 bytes, but that is okay because I am hashing this.';
$password = hash('md5', $plaintextPass); /* the encryption key */
Run Code Online (Sandbox Code Playgroud)
有了这个,无论我使用什么明文密码,我都可以使用有效的32个字符/字节字符串作为我的加密密钥/密码.但这确实减少了加密密钥/密码的熵,因为正常的32个字符串具有比MD5散列输出更大的密钥空间(每个字节256个可能性,每个字节16个可能性); 然而,16 ^ 32仍然肯定超出蛮力范围.
偏离主题:在我的一些个人程序中,我一直在使用32个随机生成的字节,其值介于0-255之间.这将使得加密密钥256 ^ 32的熵对于暴力是不可行的.这也将抵抗字典攻击,因为32字节是使用加密安全的伪随机数生成器(CSPRNG)随机生成的.
所以,总而言之,是的,$password参数确实是用于加密的密钥.我同意你的意见应该写$key在文档中,但是哦.您选择用于加密的密码/密钥可以是人类可读的,只要它满足散列密钥的长度要求即可.为了满足这些长度要求,可以散列人类可读/明文密码并使用该密码的散列作为密钥($password参数),但人类可读的密码仍然应该是长且唯一的.
文档不是很清楚,但是当我试图理解该函数时,PHP文档页面上的这条评论openssl_encrypt()确实帮助了我.评论提供了一个示例以及有用的信息.直接引用评论的作者:
因为此处记录的密码参数不是密码.......这是关键![评论略有编辑]
| 归档时间: |
|
| 查看次数: |
4999 次 |
| 最近记录: |