在MySql

时间:2018-04-05 12:10:14

标签: mysql

我需要加密一些字段。我知道我无法将当前数据加密到自身,因此我将创建新字段。我们说“name”和“name_enc”,“email”和“email_enc”。 我的测试显示,如果我省略了WHERE资格,它确实可以在表中的每一行上运行 - 但这是一种安全可靠的技术吗?

UPDATE users SET name_enc= AES_ENCRYPT(name,'mykey'),  email_enc= AES_ENCRYPT(email,'mykey');

我担心的是,如果我这样做:

UPDATE users SET name='fred'

然后每一行都会被设置为'fred'

MySql是否自行解决了我想要更新的行是每行隐式的?

我只会做一次,但我需要确定它没问题。 (显然关键是它通过PHP节省了循环和单个行更新)

1 个答案:

答案 0 :(得分:1)

让我们一点一点。

  

我知道我无法将当前数据加密到自身,

实际上,如果你准备好适当的列,你可以。

  

所以我会创建新的领域。让我们说" name"和" name_enc","电子邮件"   和" email_enc"。

这很难带你前进,因为你在表格中存储了普通和密文版本。为了实现最终目标,即加密数据,您仍然必须删除原始列并重命名您创建的新列(以及应用程序中的所有相关更改)。

  

我的测试显示,如果我遗漏了它,它确实可以在表中的每一行上运行   资格认证 - 但这是一种安全可靠的技术吗?

是的,如果新列足够长以存储新加密的值,那么它是安全的。目标列应为VARBINARY类型,列长度需要使用

计算
16 * (FLOOR(current_field_length / 16) + 1).
  

更新用户SET name_enc = AES_ENCRYPT(姓名,' mykey'),email_enc =   AES_ENCRYPT(电子邮件,'的myKey&#39);

这样可以正常工作。

  

我担心的是,如果我这样做:

     

更新用户SET name =' fred'

     

然后每一行都会被设置为' fred'

你是对的。它会这样做,因为与其他示例不同,您没有在赋值的右侧使用列名。另一个例子是

UPDATE users SET age = 1;

这将使每个人1岁。与

比较
UPDATE users SET age = age + 1;

这将使每个人都大一岁。

  

MySql是否自行解决了我想要更新的行   每行含蓄?