保存密码

时间:2018-03-30 16:31:22

标签: php encryption cryptography

实际上我有一个存储客户敏感信息的数据库。 我正在使用类似的东西来加密这些数据:

$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脚本需要调用它进行解密。

2 个答案:

答案 0 :(得分:1)

我建议您使用Argon2从用户密码派生$key,然后使用Symmetric Encryption(如AES)或XSalsa20或XChacha20对其进行加密,或者您可以使用其他派生功能,这使得暴力行为不切实际,只需要注意salt永远不会重复使用,请查看 Vaultlibsodium-php

答案 1 :(得分:0)

  

如您所见,我使用客户的电子邮件为密钥创建了iv和密码md5。

您可能需要了解的一些事项

  • IV假设CTR模式是唯一的,但正如已经指出的那样,它是静态的(源自电子邮件)。
  • 可以在商品hw(最新的调整方法)上找到md5碰撞一分钟
  • 您缺少任何身份验证标记。

加密的常见做法是将随机IV,加密源和MAC作为密文的一部分(例如iv.encrypted.mac)

如果你没有存储密钥,imho从密码md5创建一个密钥是可行的,所以没有什么可以找到冲突,密码具有高熵(长和随机)

  

因此,如果有人破解我的bdd,他可以解密敏感数据。有没有更好的方法,知道我的PHP脚本需要能够解密数据以供使用

存储系统凭据通常存在问题。您可以使用凭证保险库,但需要将保险库凭证存储在某处。您可以加密系统凭据,但需要将解密密钥存储在某处。至少要隐藏凭证,以免使用自动黑客工具或不那么专注的对手。