如何仅使用 PHP 解密在 Laravel 之外使用 Laravel 4 Encrypt 类加密的字符串?
问问题
9698 次
2 回答
3
LaravelEncrypter
类使用由 Mcrypt PHP 扩展提供的块大小为 256 位的 Rijndael 进行加密。该类Encrypter
使用两种简单的方法工作,encrypt()
并且decrypt()
.
下面的一个例子:
<?php
$secret = Crypter::encrypt('some text here'); //encrypted
$decrypted_secret = Crypter::decrypt($secret); //decrypted
?>
既然你问如何“在 Laravel 之外”做到这一点:
加密和解密由加密器类完成。Laravel 源是公开的,这里是相关部分:
<?php
public function encrypt($value)
{
$iv = mcrypt_create_iv($this->getIvSize(), $this->getRandomizer());
$value = base64_encode($this->padAndMcrypt($value, $iv));
$mac = $this->hash($iv = base64_encode($iv), $value);
return base64_encode(json_encode(compact('iv', 'value', 'mac')));
}
protected function padAndMcrypt($value, $iv)
{
$value = $this->addPadding(serialize($value));
return mcrypt_encrypt($this->cipher, $this->key, $value, $this->mode, $iv);
}
public function decrypt($payload)
{
$payload = $this->getJsonPayload($payload);
$value = base64_decode($payload['value']);
$iv = base64_decode($payload['iv']);
return unserialize($this->stripPadding($this->mcryptDecrypt($value, $iv)));
}
protected function mcryptDecrypt($value, $iv)
{
return mcrypt_decrypt($this->cipher, $this->key, $value, $this->mode, $iv);
}
?>
有关文档和评论,请参阅GitHub 上的Laravel 源代码。
我希望这有帮助。
于 2013-06-30T15:06:12.317 回答
1
Laravel的Encrypter
类容易发生变化。这是由于一些已修复的安全漏洞。因此,要成功解密,您需要执行以下操作:
- 获取正确的源代码,例如4.2.16;
- 让它在你的机器上工作。确保您在相同的 PHP 环境中运行(使用最新版本的 OpenSSL 扩展);
- 使用正确的键实例化类
Encrypter
,并可能设置正确的模式和算法; - 最后,调用
decrypt
.
解密所需的所有其他参数(IV 和 MAC 值)应包含在密文中。
于 2015-01-17T15:14:46.503 回答