假设表中的每一行都有与一个特定用户有关的数据.用户有密码来访问系统.
如何使用InnoDB加密一列数据,以便除了数据用户以外的任何人都无法读取数据?我正在考虑使用一种MySQL加密函数(比如AES)和一个基于根据用户密码计算的哈希的密钥.
有没有人对我如何做到这一点有任何指示?我是在正确的轨道上吗?
以下答案之一
修改用户密码的问题涉及通过新密码重新加密用户密钥,这比重新加密可以任意大的整组用户数据要简单得多.用户密钥在系统中的用户数据的整个生命周期内保持不变.
这有什么用?说密码是pass1.并且有一堆记录使用由此生成的密钥加密.如果用户现在将密码重置为pass2,我无法解密使用pass1加密的数据.在用户完全忘记密码的情况下,他的所有加密数据都将丢失.
我不知道用用户的密码哈希加密数据是否有多大意义,特别是如果你在数据库中保留哈希本身.在这种情况下,任何可以访问加密数据的人也可以访问密码哈希并解密数据.
另一种方法是使用特定于应用程序的密钥加密数据,并使用某些特定于用户的数据.但是,您面临另一个问题:如何安全地存储应用程序密钥.对于这个问题,我不知道一个简单的答案,但是如果您担心数据库数据可能受到损害,而不是源代码本身,例如如果您的数据库存储在异地(例如,如果您的数据库存储在异地),则将其保留在源代码中可能已经足够了(想想亚马逊S3).
如果您只在数据库中保留密码的哈希值,那么使用用户密码保存应用密钥会有所帮助,但会引入另一个安全漏洞:您必须在应用会话中以明文形式保留用户密码.
至于技术解决方案,它非常简单,并且可以使用示例代码.您可以按如下方式对其进行修改,以使用密码哈希加密的应用程序密码加密数据:
INSERT INTO secure_table VALUES ( 1, AES_ENCRYPT( 'plain text data', CONCAT(@application_password, @user_password)) );
在任何情况下,您都必须将应用程序密码存储在某处,因此我认为没有一种简单的方法可以提供完美的安全性.
我能想到的另一种方法是向用户询问可以用作加密密钥的简短PIN.PIN不会存储在数据库中,但每次访问数据时都需要用户询问.
当然,您必须考虑加密的可行性.如果没有解密,您将无法索引或搜索它.可能需要一组有限的数据(例如信用卡号),但我不会对它有所了解.