PHP openssl_decrypt returns 大约 10% 的时间出现奇怪的输出
PHP openssl_decrypt returns strange output about 10% of the time
利用我在互联网上可以找到的所有知识,我想出了一个 salt openssl 加密和解密功能。它在 90% 的时间都有效,但偶尔解密 returns 会产生一个与加密数据无关的空字符串或随机字节。我使用的代码是:
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) "�"
或者完全空字符串的return:
string(72) "MDrQ+5c83vJXnva1OjrbJ2RWGjU5ajrwCn+qCneIIOqh48Gt0JmbOllsZFVUMHRuUFQwPQ=="
string(0) ""
string(0) ""
我解密两次是为了看是解密还是加密出了问题,结果很明显是加密出了问题
我的问题是导致数据加密错误的原因是什么? & 我可以改进此方法并使其更加安全吗?
虽然这不是为什么会发生的答案,但通常结果才是最重要的。
如果是这样,那么,如果您获得 90% 的准确率,while 循环将很快让您上路......
while(strlen($testD) < 5) {
$testD=Decrypt($testE, 'Key0');
}
如果您的目标是找出导致小错误的原因,那么您可能需要更深入地查看核心代码。然而,在我的立场上,"get it done and move on" 通常是老板所说的,所以找到一个收集信息的有效解决方案通常是我必须处理的事情。
利用我在互联网上可以找到的所有知识,我想出了一个 salt openssl 加密和解密功能。它在 90% 的时间都有效,但偶尔解密 returns 会产生一个与加密数据无关的空字符串或随机字节。我使用的代码是:
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) "�"
或者完全空字符串的return:
string(72) "MDrQ+5c83vJXnva1OjrbJ2RWGjU5ajrwCn+qCneIIOqh48Gt0JmbOllsZFVUMHRuUFQwPQ=="
string(0) ""
string(0) ""
我解密两次是为了看是解密还是加密出了问题,结果很明显是加密出了问题
我的问题是导致数据加密错误的原因是什么? & 我可以改进此方法并使其更加安全吗?
虽然这不是为什么会发生的答案,但通常结果才是最重要的。
如果是这样,那么,如果您获得 90% 的准确率,while 循环将很快让您上路......
while(strlen($testD) < 5) {
$testD=Decrypt($testE, 'Key0');
}
如果您的目标是找出导致小错误的原因,那么您可能需要更深入地查看核心代码。然而,在我的立场上,"get it done and move on" 通常是老板所说的,所以找到一个收集信息的有效解决方案通常是我必须处理的事情。