我想把一个额外的安全层到我的散列密码(使用password_hash函数与argon2i)通过加密散列密码与安全胡椒,这是萨费德的在我的wordpress网站的公共区域以外的目录。
我做了很多研究,并得出了以下php代码。但我不是一个专业的程序员,所以我只是问自己,如果这是正确的方式,我如何使用这两个函数“openssl_encrypt()”和“hash_hmac()"。
如果能从你们那里得到一些专业的反馈就太好了。
以下是我目前为止的代码:
// Encryption Function
function secured_encrypt($data) {
$first_key = base64_decode(FIRSTKEY);
$second_key = base64_decode(SECONDKEY);
$method = "aes-256-cbc";
$iv_length = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($iv_length);
$first_encrypted = openssl_encrypt($data,$method,$first_key, OPENSSL_RAW_DATA ,$iv);
$second_encrypted = hash_hmac('sha3-512', $first_encrypted, $second_key, TRUE);
$output = base64_encode($iv.$second_encrypted.$first_encrypted);
return $output;
}
function secured_decrypt($input) {
$first_key = base64_decode(FIRSTKEY);
$second_key = base64_decode(SECONDKEY);
$mix = base64_decode($input);
$method = "aes-256-cbc";
$iv_length = openssl_cipher_iv_length($method);
$iv = substr($mix,0,$iv_length);
$second_encrypted = substr($mix,$iv_length,64);
$first_encrypted = substr($mix,$iv_length+64);
$data = openssl_decrypt($first_encrypted,$method,$first_key,OPENSSL_RAW_DATA,$iv);
$second_encrypted_new = hash_hmac('sha3-512', $first_encrypted, $second_key, TRUE);
if (hash_equals($second_encrypted,$second_encrypted_new)) return $data;
return false;
}
1条答案
按热度按时间a8jjtwal1#
老实说,我不认为你引用的代码提供了任何额外的安全级别以上的基本open_ssl加密/解密的例子从PHP手册。
我看到它贴在PHP手册的评论中,有许多赞成票,但事实是SECONDKEY根本不参与加密。它仅用于验证数据的哈希。在该代码中,只有FIRSTKEY用于加密和解密消息,黑客将需要解密您的消息(因为$iv以纯文本形式包含在其中)。
同样级别的数据验证(哈希验证)可以通过简单地使用PHP手册中提供的$tag和“aes-128-gcm”来实现,即:
将FIRSTKEY与代码的其余部分分开存储可以提供您想要的额外安全层(在您提供的示例中可能没有其他内容)。是否将$iv和$tag与加密数据一起存储取决于您(因为我认为您不会通过公共通信渠道传递它)。
您可以通过将$iv和$tag存储在另一个存储中(即,另一台服务器上的单独DB)。
请记住,无论您做了多少预防措施,如果黑客可以通过访问您的服务器文件系统进行逆向工程,那么它们都是徒劳的。也就是说,如果我可以访问您的服务器,我可以只创建PHP文件与
<?php echo FIRSTKEY; ?>
在它:D