【问题标题】:How to implement Crypt::encrypt method manually in PHP?如何在 PHP 中手动实现 Crypt::encrypt 方法?
【发布时间】:2017-05-10 16:18:33
【问题描述】:

我尝试在 php 中实现 Crypt::encrypt 函数,这段代码在这里:

$key = "ygXa6pBJOWSAClY/J6SSVTjvJpMIiPAENiTMjBrcOGw=";
$iv = random_bytes(16);
$value = \openssl_encrypt(serialize('123456'), 'AES-256-CBC', $key, 0, $iv);
bIv = base64_encode($iv);
$mac = hash_hmac('sha256', $bIv.$value, $key);
$c = ['iv'=>$bIv,'value'=>$value,'mac'=>$mac];
$json = json_encode($c);
$b = base64_encode($json);  

但结果是错误的。
我想在 openssl_encrypt 函数中设置之前我应该​​在 $key 上做一些事情。
请帮忙。
谢谢。

【问题讨论】:

  • 亲爱的你能解释一下你的问题吗?不清楚你在问什么?
  • Crypt::encrypt('123456');我想在纯 php 中实现这个 laravel 函数。 @recoverymen
  • 结果必须是这样的:eyJpdiI6Im1RT2pLeHEyNXRmRkFialdnYlFBU0E9PSIsInZhbHVlIjoiOGduRnRjSkFjbWhvQlNIWlNKZU1jdz09IiwibWFjIjoiNzdmM2FlNTJhZjU3NmYxYWNkZDQ4NmFjM2MzYjEyZTNjZDI5MGI0OWVhYmMzNmQ4Mzg4NTRhOGU3MzA1ZTE4NyJ9 跨度>
  • $key 在使用 encrypt 函数之前转换成如下内容:���I9d�V?'��U8�&���B$̌�8l���I9d�V?' ��U8�&���B$̌�8l 我不知道这个改变 $key 的函数是什么。

标签: php laravel encryption serialization hash


【解决方案1】:

已解决:
我们可以这样实现这个方法:

$text = '123456';
$key = "ygXa6pBJOWSAClY/CFEdOTjvJpMIiPAMQiTMjBrcOGw=";
$key = (string)base64_decode($key);
$iv = random_bytes(16);
$value = \openssl_encrypt(serialize($text), 'AES-256-CBC', $key, 0, $iv);  
$bIv = base64_encode($iv);
$mac = hash_hmac('sha256', $bIv.$value, $key); 
$c_arr = ['iv'=>$bIv,'value'=>$value,'mac'=>$mac];
$json = json_encode($c_arr);
$crypted = base64_encode($json);
echo $crypted;  

这项工作让我很痛苦。
享受:)
成功

【解决方案2】:

这里是实现,直接来自official source code

public function encrypt($value)
{
    $iv = random_bytes(16);
    $value = \openssl_encrypt(serialize($value), $this->cipher, $this->key, 0, $iv);
    if ($value === false) {
        throw new EncryptException('Could not encrypt the data.');
    }
    // Once we have the encrypted value we will go ahead base64_encode the input
    // vector and create the MAC for the encrypted value so we can verify its
    // authenticity. Then, we'll JSON encode the data in a "payload" array.
    $mac = $this->hash($iv = base64_encode($iv), $value);
    $json = json_encode(compact('iv', 'value', 'mac'));
    if (! is_string($json)) {
        throw new EncryptException('Could not encrypt the data.');
    }
    return base64_encode($json);
}
  • $iv 应该和源中的一样
  • $this->key 是您在 .env 文件中设置的加密密钥,编码为 b64
  • $this->cipher 应该是您在 laravel 配置中配置的,并且与您的密钥长度兼容。

在您的示例中,您已将 $key 设置为“base64:”字符串之后的值,这不是键。您需要在传递之前使用 base64 对密钥进行编码。

所以$key 转为ygXa6pBJOWSAClY/J6SSVTjvJpMIiPAENiTMjBrcOGw= 的base64 编码,即eWdYYTZwQkpPV1NBQ2xZL0o2U1NWVGp2SnBNSWlQQUVOaVRNakJyY09Hdz0K

【讨论】:

    猜你喜欢
    • 2017-05-23
    • 2011-01-15
    • 1970-01-01
    • 2015-11-08
    • 2020-12-05
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多