【问题标题】:PHP openssl_decrypt returns strange output about 10% of the timePHP openssl_decrypt 大约 10% 的时间返回奇怪的输出
【发布时间】: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


【解决方案1】:

虽然不是为什么会发生的答案,但结果往往是最重要的。

如果是这样,那么,如果您获得 90% 的准确率,while 循环将很快让您上路.....

while(strlen($testD) < 5) {
    $testD=Decrypt($testE, 'Key0');
}

如果您的目标是找出导致小故障的原因,那么您可能需要更深入地研究核心代码。但是,在我的职位上,“完成它并继续前进”通常是老板们所说的,因此我通常必须找到一个可行的解决方案来收集信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2023-03-10
    • 2020-07-18
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多