Php 加密存储密码

Php 加密存储密码,php,encryption,cryptography,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_

事实上,我有一个存储客户敏感信息的数据库。 我正在使用类似的方法来加密数据:

$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脚本需要调用该服务器进行解密

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

有几件事你可能需要注意

  • IV假设CTR模式是唯一的,但正如已经指出的,它是静态的(源自电子邮件)
  • 可以在商品hw上一分钟内找到md5碰撞(最新调整方法)
  • 您缺少任何身份验证标记
加密的常见做法是将随机IV、加密源和MAC作为密文的一部分(例如IV.encrypted.MAC)

假设您不存储密钥,那么从密码md5创建密钥的方法可能是可行的,因此没有任何冲突,并且密码具有高熵(长且随机)

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


存储系统凭据通常是一个问题。您可以使用凭证保管库,但需要将保管库凭证存储在某个位置。您可以加密系统凭据,但需要将解密密钥存储在某个位置。至少要将凭证隐藏起来,使自动化黑客工具或不那么专心致志的对手更难操作

我建议您使用Argon2从用户密码派生出
$key
,然后使用AES、XSalsa20或XChacha20等对称加密对其进行加密,或者您也可以使用其他派生函数使暴力变得不切实际,只需注意不要重复使用
salt
,看看如果有人同时访问了你的数据库和源代码(这是他们知道如何对“敏感数据”进行反向工程的唯一方法,对不对),那么我会说,不管发生什么,你都是骨瘦如柴的。@PatrickQ我通常是这样做的。如果它们都得到了,就结束了,因为这意味着它们都在服务器上。游戏结束了,伙计,游戏结束了!你好像说代码不“可查找”?如果是,添加第二台服务器来存储密码并进行数据解密应该是有利可图的?如果有人进入服务器直接获取数据库文件,他们也可以获取网站源代码。但是,如果有人只是获取了数据库的内容(sql注入攻击、其他数据库漏洞),那么他们就不一定能够访问源代码。黑客入侵服务器通常比通过不恰当地使用罐装开源代码库等方式转储数据库内容更困难。计数器需要一个起始随机值,因此决不能重用密钥和计数器起始值组合。使用密码时,应使用钥匙;d可以使用包含迭代的函数(如PBKDF2)派生。简单地使用MD5是不安全的。