如何在PHP中手动实现Crypt :: encrypt方法?

时间:2016-12-26 06:26:17

标签: php laravel encryption serialization hash

我尝试在 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上执行一些操作。
请帮忙。
谢谢。

2 个答案:

答案 0 :(得分: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;  

这项工作对我而言 享受:)
成功

答案 1 :(得分:0)

以下是直接来自overload的实现。

$iv
  • $this->key应与源
  • 中的相同
  • $this->cipher是您在.env文件中设置的加密密钥,以b64编码
  • $key应该是您在laravel配置中配置的并与您的密钥长度兼容的。

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

ygXa6pBJOWSAClY/J6SSVTjvJpMIiPAENiTMjBrcOGw=eWdYYTZwQkpPV1NBQ2xZL0o2U1NWVGp2SnBNSWlQQUVOaVRNakJyY09Hdz0K的base64编码SELECT DATE(created_at) AS date_visited, page_id, COUNT(1) AS visits FROM your_table_name GROUP BY DATE(created_at), page_id _this