如何加密mysql表中的现有列?

时间:2012-06-27 11:53:02

标签: mysql

我的表格有密码字段,这是一个纯文本。现在,我想加密该字段。怎么办?

8 个答案:

答案 0 :(得分:2)

MySQL具有广泛的内置加密功能,您可以找到详细的概述here

你可能想看看例如AES_DECRYPT()和AES_ENCRYPT()。

INSERT INTO table (mycolumn) VALUES(AES_ENCRYPT('Hello!', 'encryption_key'));
SELECT AES_DECRYPT(mycolumn, 'encryption_key') FROM table;

答案 1 :(得分:1)

将数据库备份(仅限数据)作为csv文件。使用以下查询使用密钥更新现有字段:

LOAD DATA INFILE 'C:/Sample.csv' INTO TABLE myTable(myname,@mypass) SET mypass=AES_ENCRYPT(@mypass,'key:test');

希望它能解决你的问题。

答案 2 :(得分:0)

更新密码字段以更改要哈希的密码。你可以使用SHA1。您希望哈希密码,而不是加密。

检查提供的密码是否正确时,您需要散列用户提供的值并将其与数据库字段中的值进行比较。

在对密码进行哈希处理时,您需要使用某种盐。理想情况下,每个用户应该有所不同。一个类似的问题包含好的答案:Secure hash and salt for PHP passwords

答案 3 :(得分:0)

您可以使用md5或密码,但请注意rainbow tables

mysql> select md5('a');
+----------------------------------+
| md5('a')                         |
+----------------------------------+
| 0cc175b9c0f1b6a831c399e269772661 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select password('a');
+-------------------------------------------+
| password('a')                             |
+-------------------------------------------+
| *667F407DE7C6AD07358FA38DAED7828A72014B4E |
+-------------------------------------------+
1 row in set (0.00 sec)

有些ppl只是以一种方式加密密码并添加一些愚蠢的文字,I.E

假设您要加密“Hello”并且您将使用MD5,您将这样做:

mysql> select password('dumbtext Hello');
+-------------------------------------------+
| password('dumbtext Hello')                |
+-------------------------------------------+
| *1F2CE4EA3F6F689369453F090A660A9D0314AD90 |
+-------------------------------------------+
1 row in set (0.00 sec)

然后,如果你想验证会话,你只需在用户在表单的输入字段中使用的密码进行匹配:

if(md5(“dumptext”.user(password_input))==数据库中的字段,然后Session ON !. if if not Reject

这里是Mysql密码encrypt information,有不同的选项,这取决于你

答案 4 :(得分:0)

为什么不使用列级加密解决方案?

正如我最近发现的,MySQL内部加密功能有许多缺点。 我从一个提供mysql加密免费软件的博客中获取了这些信息。 http://www.mydiamo.com/index.php/mdblog/item/24-why-applying-mysql-internal-encryption-functions-only-is-not-enough

如果您只是尝试加密密码字段,则列级加密解决方案可能是为您提供安全性的最佳方式。 (列级加密是一种数据库加密方法,其中特定列中每个单元(或数据字段)中的信息具有相同的密码,用于访问,读取和写入.-来自WhatIs.com - )

MyDiamo,这是我上面谈到的免费软件,似乎很方便使用。也许你可以尝试一下。

答案 5 :(得分:0)

是什么让我在你的帖子上绊倒是因为我遇到了同样的问题,但不知怎的,我弄明白了。 我最初创建了一个表并将数据插入其中,而没有对其进行加密:我后来发现有一种方法可以在mysql中加密数据,但它只使用了一个查询和md5(),sha(),sha1 (),sha2()和可能更多

这就是我所做的。

您必须创建另一个与当前表相同的表(但当然使用不同的表名)。

INSERT INTO users_new(userID, password) SELECT userID, sha1(password) FROM users;

现在请注意,这些是两个不同的表(users和users_new),这些表具有相同的列名和特征。该命令将userID的值和加密的(使用sha1()函数)密码复制到表用户中。

请记住使列密码的类型为VARCHAR(40),因为解密的字符长度为40bytes(字符)长。

希望这有用。发表评论或发表回复。

更加恩惠给你。

答案 6 :(得分:0)

加密数据有两种理念:

  • 单向哲学 使用算法对数据进行加密或散列,以便无法获取原始字符串。这可以使用MD5或SHA1来完成。

    插入用户(用户,密码)值('userLogin',md5('myPassword'));

    更新用户设置密码= sha1('myOtherPassword'),其中user ='userLogin';

验证这一点的方法是将方法(sha1或md5)应用于用户提供的密码,并将得到的哈希值与存储在数据库中的哈希值进行比较。

select id from users where user='userLogin' and password = sha1('passwordFromUser')
  • 双向理念 使用可以编码或解码的算法加密数据。这可以使用AES_ENCRYPT()和AES_DECRYPT()来完成。

    插入用户(用户,密码)值('userLogin',AES_ENCRYPT('myDecodeablePass','myEncryptionKey'));

验证这一点的方法是,对存储的字符串使用解密方法,并将结果与​​用户提供的密码进行比较

select AES_DECRYPT(password, 'myEncryptionKey') as myDecodedPassword from users 
where user='userLogin';

请注意,这样一种中间人攻击可能会破坏加密密钥,从而冒着所有密码的风险,除非它是每用户密钥。

注意: 为避免彩虹表(或预先计算的哈希表),建议在要加密的字符串中插入随机非字典单词...因为很多用户倾向于使用简单的密码,如“密码”或“123456”

答案 7 :(得分:0)

alter table tableName  modify columnNameToBeEncrypted varbinary(200);
update tableName 
set columnNameToBeEncrypted = aes_encrypt(tableName.columnNameToBeEncrypted, 'secretyKey');

首先将要加密的列更新为varbinary类型。这样可以保存加密值 然后更新表以将加密值存储到位,如上所示。这会将加密值保存在表格中。

要查看此值,请使用以下查询:

select *, CAST(aes_decrypt(columnNameToBeEncrypted, 'secretyKey') AS CHAR(40)) from tableName;

以上SQL个问题已在MySQL上进行了测试。