php openssl iv,PHP-openssl_encrypt,openssl_decrypt密钥,iv

根据OpenSSL(https://www.openssl.org/docs/apps/enc.html#OPTIONS)的文档,他们期望key和iv为十六进制值;这仅表示数字吗?还是会使用md5哈希? (因为md5似乎不可逆)

>请注意,我提到了key和iv,因为PHP函数openssl_encrypt中的$password实际上是密钥.

function strtohex($x)

{

$s='';

foreach (str_split($x) as $c) $s.=sprintf("%02X",ord($c));

return($s);

}

$source = 'It works !';

$iv = substr( md5( "123sdfsdf4567812345678" ), 0, 16 );

$pass = '1234567812345678';

$method = 'aes-256-cbc';

echo "\niv in hex to use: ".$iv;

echo "\nkey in hex to use: ".strtohex($pass);

echo "\n";

file_put_contents ('./file.encrypted',openssl_encrypt ($source, $method, $pass, true, $iv));

$exec = "openssl enc -".$method." -d -in file.encrypted -nosalt -nopad -K ".strtohex($pass)." -iv ".$iv;

echo 'executing: '.$exec."\n\n";

echo exec ($exec);

echo "\n";

解决方法:

您的第一个链接是关于命令行工具,而不是PHP函数.您将很难在终端中投入二进制数据,因此为什么必须对密钥进行十六进制编码.

但是,在PHP中,openssl_encrypt()和openssl_decrypt()需要一个原始二进制字符串.

该文档还具有误导性,因为它提到的是“密码”而不是“密钥”.您已经注意到了,但是加密密钥不是您应该仅通过键盘输入的内容,并且md5()-也不是加密密钥的答案.

密钥必须通过openssl_random_pseudo_bytes()随机生成(或者至少对于您的情况而言这是最方便的方式):

$key = openssl_random_pseudo_bytes(32);

(静脉注射也是如此)

如果需要对生成的$key进行十六进制编码,只需将其传递给bin2hex(),但是您给出的示例有点破损……您正在执行双重加密.通过PHP加密文件内容就足够了,您无需处理命令行.

请注意,我的回答远非做加密的全部故事.您还应该添加身份验证,适当的填充,仔细考虑如何进行管理和维护.存储您的密钥等

如果您只需要简单地完成工作,请使用流行的加密库,不要自己编写.

标签:encryption,openssl,php-openssl,php

来源: https://codeday.me/bug/20191121/2050932.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值