我正在从PHP脚本管理MySQL数据库。 服务器和客户端之间的通信通过SSL保护。 我存储敏感的用户帐户数据。
有没有办法在输入数据库时加密这些数据? 保护这些敏感数据的最佳方法是什么?
编辑:我正在使用CRON作业来更新依赖此密码登录用户帐户的数据。 所以我需要一种方法来散列这个密码,并能够获得我的CRON工作任务的原始密码。
实现它的最佳方法是什么?
由于
答案 0 :(得分:15)
说真的,不要使用MySQL的aes_encrypt()这是使用分组密码的最不安全的方法。它正在使用ECB模式,我可以给出一个简单的示例演示为什么这是一个严重的错误。
纯文字信息:
使用ECB模式加密的相同消息(与您使用的密码无关):
使用CBC模式的完全相同的消息(同样,你使用的是什么密码并不重要):
更多原因不使用mysql的aes_encrypt,最值得注意的是,您发送的每个查询也都有您使用的aes密钥。如果数据库遭到入侵,攻击者将启用日志记录并获取您的密钥并解密整个数据库。
那么应该使用什么?我暂时喜欢this class。它使用CBC模式,具有String2Key功能和IV。您可以使用主键作为IV,每条消息必须具有唯一的IV。如果攻击者知道IV,并且它们是顺序的,那么它是可以的,只要块密码实现是安全的。重新使用IV WEP much less secure。
答案 1 :(得分:3)
MySQL中有加密函数,
http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html
例如,您可以使用aes_encrypt()以加密形式存储数据。
然而,这些功能存在一些弱点,
它不支持IV或块链接。相同的文本总是加密成相同的密文,因此不适合密码等敏感数据。
没有关键信息,因此旋转密钥非常困难。
答案 2 :(得分:2)
有一些基本的方法可以做到(除非你提供一些关于你想要完成什么的更全面的信息)。
如果您要保护自己不要成为黑客,那么这应该没问题。我再次要求你详细说明。
您还必须考虑所需的安全级别与算法的速度。
答案 3 :(得分:1)
对于一个非常有用的答案,有太多的信息,但这是常见的情况:
如果您将密码存储在应检查用户输入是否正确但您不需要原始数据本身的位置,则可以存储散列(SHA1 / SHA2)。查找哈希的所有实践都是正确的。
如果您需要回读原始数据,可以使用加密功能。 AES是一种很好的对称加密选择。但是,这里的问题变成了关键管理。您在哪里存储用于加密/解密的密钥?这是一个非常普遍的问题,根据具体情况,这是不同的解决方案。