使用 mcrypt 加密敏感数据

Posted

技术标签:

【中文标题】使用 mcrypt 加密敏感数据【英文标题】:Encrypting sensitive data with mcrypt 【发布时间】:2012-08-11 19:18:13 【问题描述】:

大家好,我有一个关于加密/解密个人敏感信息的安全问题:身份(姓名、地址、电话号码)、银行详细信息(排序代码和帐号)几乎所有内容都已加密,并且只能由本人访问并由授权人使用个人数据。现在主要的问题是: 1. 我的方法够安全吗? 2. 有没有更好的方法? 3. 我应该在哪里使用来自数据库或 $_SESSION 的密钥?(最好在哪里使用它们进行解密以便用户查看他的详细信息)

这里是代码: $iv = mcrypt_create_iv(32, MCRYPT_RAND); $key = mcrypt_create_iv(32, MCRYPT_RAND); $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $unencrypted, MCRYPT_MODE_CBC, $iv);

这是在我将数据发送到数据库之前加密数据

$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CBC, $iv );

这是解密方法。(使用上面示例中的 $encrypted、$key 和 $iv)。

【问题讨论】:

您将生成的密钥和 IV 存储在哪里? 【参考方案1】:

加密任何敏感信息并将密钥存储在数据库中没有安全优势。这与锁定保险箱并将钥匙留在钥匙孔中相同。至少您需要将密钥存储在文件系统上,而不是数据库中。在这种情况下,如果您的数据库被泄露(例如由于 SQL 注入攻击),攻击者将无法解密它,因为他们没有密钥。

编辑 没有办法保护包含密钥的文件,因为 php 需要读取它才能进行所需的操作。但是,您可以使用 HSM(硬件安全模块)设备将密钥存储在那里。以YubiHSM 为例。

【讨论】:

是的,这实际上是一个好点。好的,我应该如何保护文件?

以上是关于使用 mcrypt 加密敏感数据的主要内容,如果未能解决你的问题,请参考以下文章

PHP mcrypt加密扩展使用总结

使用 PyCrypto 进行 AES 加密并使用 mcrypt 进行解密

PHP Mcrypt,它到底有多安全? [关闭]

用 OpenSSL 替换 Mcrypt

敏感数据加密解密

敏感数据加密保护和数据库访问方式的测试内容