我正在使用Symfony 3.4和PHP 7.2和SQLite数据库开发一个Web应用程序。
我想使用标准库(openssl或钠(使用AES-256加密实体的某些字段,但我真的不确定如何正确执行此操作,因此在我犯许多可怕的大错误之前,我正在寻求您的指导:
- 存储密钥和 IV 的最佳实践是什么?
- 只要网络浏览器无法访问它,它是否与我放置它的位置相关?我想把它们放在 config.yml 中,但感觉不对,非常不对劲
- OpenSSL和钠之间哪个库更安全?
我使用以下代码,其中我的密钥存储在 parameters.yml 中,因此如果您将其推送到 Git,它将不可见。
/**
* SecurityHelper.
*
* @author Kengy Van Hijfte <development@kengy.be>
*/
class SecurityHelper
{
/** @var string $secret */
private $secret;
public function __construct($secret)
{
$this->secret = $secret;
}
/**
* @param $text
* @return string
*/
public function encrypt($text)
{
if (null == $text)
return null;
// Generate an initialization vector
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
// Encrypt the data using AES 256 encryption in CBC mode using our encryption key and initialization vector.
$encrypted = openssl_encrypt($text, 'aes-256-cbc', $this->secret, 0, $iv);
// The $iv is just as important as the key for decrypting, so save it with our encrypted data using a unique separator (::)
return base64_encode($encrypted . '::' . $iv);
}
/**
* @param $text
* @return string
*/
public function decrypt($text)
{
if (null == $text)
return null;
// To decrypt, split the encrypted data from our IV - our unique separator used was "::"
list($encrypted_data, $iv) = explode('::', base64_decode($text), 2);
return openssl_decrypt($encrypted_data, 'aes-256-cbc', $this->secret, 0, $iv);
}
}