实际上我有一个存储客户敏感信息的数据库。 我正在使用类似的东西来加密这些数据:
$algo = 'AES-256-CTR';
$key ='password md5 from bdd'
$iv = substr(hash('sha256',$email),0,openssl_cipher_iv_length($algo));
$data = base64_encode($data);
$data = openssl_encrypt($data,$algo,$key,OPENSSL_RAW_DATA,$iv);
如您所见,我正在使用客户的电子邮件为密钥创建iv和密码md5。 因此,如果有人破解我的bdd,他可以解密敏感数据。 有没有更好的方法,知道我的PHP脚本需要能够解密数据以供使用
我的想法:
- 在服务器上使用创建/修改密码和/或iv的可执行文件并进行解密,并且php脚本会调用该文件。
- 使用第二台存储密码的服务器,php脚本需要调用它进行解密。
答案 0 :(得分:1)
我建议您使用Argon2从用户密码派生$key
,然后使用Symmetric Encryption(如AES)或XSalsa20或XChacha20对其进行加密,或者您可以使用其他派生功能,这使得暴力行为不切实际,只需要注意salt
永远不会重复使用,请查看 Vault和libsodium-php
答案 1 :(得分:0)
如您所见,我使用客户的电子邮件为密钥创建了iv和密码md5。
您可能需要了解的一些事项
加密的常见做法是将随机IV,加密源和MAC作为密文的一部分(例如iv.encrypted.mac)
如果你没有存储密钥,imho从密码md5创建一个密钥是可行的,所以没有什么可以找到冲突,密码具有高熵(长和随机)因此,如果有人破解我的bdd,他可以解密敏感数据。有没有更好的方法,知道我的PHP脚本需要能够解密数据以供使用
存储系统凭据通常存在问题。您可以使用凭证保险库,但需要将保险库凭证存储在某处。您可以加密系统凭据,但需要将解密密钥存储在某处。至少要隐藏凭证,以免使用自动黑客工具或不那么专注的对手。