Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL加密列_Mysql_Security_Encryption - Fatal编程技术网

MySQL加密列

MySQL加密列,mysql,security,encryption,Mysql,Security,Encryption,假设表中的每一行都有与一个特定用户相关的数据。用户拥有访问系统的密码 如何使用InnoDB对数据列进行加密,以便除了数据的用户之外,没有人可以读取数据?我想使用一个MySQL加密函数(比如AES)和一个基于用户密码计算出的散列的密钥 有人能告诉我怎么做吗?我走对了吗 下面的答案之一 修改用户密码的问题涉及使用新密码对用户密钥进行重新加密,这比对任意大的用户数据进行重新加密要简单得多。在系统中用户数据的整个生命周期内,用户密钥保持不变 这有什么帮助?假设密码是pass1。这里有一堆用由此生成的密钥

假设表中的每一行都有与一个特定用户相关的数据。用户拥有访问系统的密码

如何使用InnoDB对数据列进行加密,以便除了数据的用户之外,没有人可以读取数据?我想使用一个MySQL加密函数(比如AES)和一个基于用户密码计算出的散列的密钥

有人能告诉我怎么做吗?我走对了吗

下面的答案之一

修改用户密码的问题涉及使用新密码对用户密钥进行重新加密,这比对任意大的用户数据进行重新加密要简单得多。在系统中用户数据的整个生命周期内,用户密钥保持不变


这有什么帮助?假设密码是pass1。这里有一堆用由此生成的密钥加密的记录。如果用户现在将密码重置为pass2,则无法解密使用pass1加密的数据。如果用户完全忘记了密码,则其所有加密数据都将丢失。

我不知道使用用户密码哈希加密数据是否有多大意义,特别是如果您将哈希本身保存在数据库中。在这种情况下,任何可以访问加密数据的人也可以访问密码哈希并解密数据

另一种方法是使用特定于应用程序的密钥加密数据,该密钥附带一些特定于用户的数据。但是,接下来您将面临另一个问题:如何安全地存储应用程序密钥。对于这个问题,我不知道一个简单的答案,但是如果您担心数据库数据可能会被泄露,那么将其保存在源代码中可能就足够了,而不是源代码本身,例如,如果您的数据库存储在异地(想想Amazon S3)

如果您在数据库中只保留密码的哈希值,则将应用程序密钥与用户密码混合会有所帮助,但会引入另一个安全漏洞:您必须在应用程序会话中以明文形式保留用户密码

至于技术解决方案,它是相当简单和简单的。您可以按如下方式对其进行修改,以使用带有密码哈希的应用程序密码加密数据:

INSERT INTO secure_table VALUES (
  1,
  AES_ENCRYPT(
    'plain text data',
    CONCAT(@application_password, @user_password))
);
在任何情况下,您都必须将应用程序密码存储在某个位置,因此我认为没有一种简单的方法可以提供完美的安全性

我能想到的另一种方法是向用户索要一个短PIN码,您可以将其用作加密密钥。PIN不会存储在数据库中,但每次访问用户的数据时都需要向用户索要PIN


当然,你必须考虑的是加密的可行性。如果不解密,您将无法索引或搜索它。对于有限的一组数据(例如信用卡号),可能需要使用它,但我不会太多。

我认为这不是最好的方法,除非你强制要求用户永远不能更改密码,或者,您可以在用户每次更改密码时重新加密所有内容。

您可以存储另一个密钥来加密/解密创建新用户时可能生成的用户特定数据。让我们把这个新密钥称为用户密钥。该用户密钥也应在数据库中加密,最直接的方法是通过用户密码或包含密码的任何其他数据(如密码和创建/修改时间等)对其进行加密

我将在用户会话中保留解密的用户密钥,以便在会话中的任何所需时间访问用户的数据

修改用户密码的问题涉及使用新密码对用户密钥进行重新加密,这比对任意大的用户数据进行重新加密要简单得多。在系统中用户数据的整个生命周期内,用户密钥保持不变

当然,只有通过在登录时向服务器发送实际用户密码来执行身份验证时,才能使用此方法,因为数据库只希望包含密码的哈希

假设密码是pass1。这里有一堆用由此生成的密钥加密的记录。如果用户现在将密码重置为pass2,则无法解密使用pass1加密的数据

密钥需要以可逆的方式加密,以便解密 使用pass1并使用pass2重新加密

总结如下:

存储在数据库中的是:单向加密密码(用于密码检查), 其他数据的加密密钥,使用clear密码可逆加密(或无论如何,密码加密方式不同于数据库中的存储方式),以及其他数据,使用clear加密密钥可逆加密

无论何时需要其他数据,都必须使用clear(或与存储在数据库中不同的加密方式)密码,读取加密密钥,用密码解密,然后使用该密码解密其他数据


更改密码时,加密密钥将使用旧密码解密、使用新密码加密并存储。

为了澄清问题中提到的一个答案:“用户/应用程序密钥”是随机生成的私钥,用于加密数据。私钥永远不会更改(除非它被泄露)。您可以使用密码加密和存储私钥。由于私钥比数据小得多,因此更改密码要便宜得多:您只需使用旧密码解密私钥,然后使用新密码对其重新加密。

如果您需要在无需用户交互的情况下访问数据(例如数据库迁移),您将没有要解密的密钥。

对于非用户特定(全局)的数据,您可以使用对称和非对称密码的组合。你可以有一个