【发布时间】:2017-12-14 20:21:48
【问题描述】:
利用我在互联网上找到的所有知识,我想出了一个 salt openssl 加密和解密功能。它在 90% 的时间内都有效,但每隔一段时间,解密就会返回一个与加密数据无关的空字符串或随机字节。我使用的代码是:
function Encrypt($subject, $method, $saltLength, $key){
if($method==0){
$salt=random_bytes($saltLength);
$key=hash('sha256', $salt.$key);
$iv=random_bytes(16);
$encrypt=base64_encode(openssl_encrypt($subject, 'aes-256-ctr', $key, 0, $iv));
$return=base64_encode("$method:$salt:$iv:$encrypt");
}
return($return);
}
function Decrypt($subject, $key){
$components = explode( ':', base64_decode($subject));
$method=$components[0];
if($method==0){
$salt=$components[1];
$key = hash('sha256', $salt.$key);
$iv=$components[2];
$encrypt=base64_decode($components[3]);
$return=(openssl_decrypt($encrypt, 'aes-256-ctr', $key, 0, $iv));
}
return($return);
}
$testE=Encrypt('Test', 0, 20, 'Key0');
var_dump($testE);
echo('<br><br>');
$testD=Decrypt($testE, 'Key0');
var_dump($testD);
echo('<br><br>');
$testD=Decrypt($testE, 'Key0');
var_dump($testD);
echo('<br><br>');
此代码的错误结果示例如下:
string(72) "MDrVsJAIE8OFjyM6y5dt+xkij5m/rTrHTnzeWs0IRrTKvNR1L7wfOmJrSlNRWFIzUFQwPQ=="
string(1) "�"
string(1) "�"
或者返回一个完全空的字符串:
string(72) "MDrQ+5c83vJXnva1OjrbJ2RWGjU5ajrwCn+qCneIIOqh48Gt0JmbOllsZFVUMHRuUFQwPQ=="
string(0) ""
string(0) ""
我解密两次的原因是看问题是在解密还是在加密,结果清楚地表明加密在某种程度上有问题。
我的问题是导致数据加密错误的原因是什么? & 我可以改进这种方法并使其更加安全吗?
【问题讨论】:
-
您可能希望对每个部分进行 base64 编码,您的 salt 或 iv 可能会生成
: -
相同数据是否会出现此问题 - 即:如果您使用相同的初始数据运行加密/解密 100 次,是否可以?
-
是的,我认为这就是问题
0:հÅ#:˗m":N|ZFʼu/:bkJSQXR3PT0=是您的解码失败。 -
如果你将问题中给出的确切代码运行100次,错误发生大约10次,所以输入数据是相同的
-
所以我应该对我的iv进行base 64编码以防止:?
标签: php encryption php-openssl