我需要加密一些字段。我知道我无法将当前数据加密到自身,因此我将创建新字段。我们说“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节省了循环和单个行更新)
答案 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是否自行解决了我想要更新的行 每行含蓄?
是