有什么方法可以只加密尚未加密的数据?

时间:2018-09-12 22:01:11

标签: mysql stored-procedures

是否有办法只加密尚未加密的数据?(有什么办法可以区分加密和未加密的数据吗?)

请假设我有一列中已经加密了一些数据,但是还没有加密。

用于加密的代码

update usersExample3 set password=aes_encrypt(password,'1234');

我有一个必须修复的存储过程,但不确定如何:

DELIMITER //

CREATE PROCEDURE de ()
LANGUAGE SQL
DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A procedure'
BEGIN
 while(there is any not encrypted data in the table)
  --if(usersExample3.password is not encrypted yet)
       update usersExample3 set password=aes_decrypt(password,'1234');
  --else (do nothing)
END//

;

我的数据库示例:

select * from usersExample3 where userId<=5;


userId  username    password            salt
1       Tom         Password1234        NULL
4       bdfg        θ¨¾jj;öN/yë‘   bcv
5       test        test                test

因此,在这里我要更新所有尚未加密的数据(在此示例中为userId 1和5。 问题是每个人都在数据库中添加数据,所以当数据保存在表中时,我有一个触发器(插入后),该触发器调用此存储过程来自动加密新数据。 谢谢

1 个答案:

答案 0 :(得分:0)

在一般情况下-不,您无法区分加密数据和非加密数据。 Buuut,看看您的例子,也许我们可以接近。未加密的密码将具有人们可以在键盘上键入的“普通”字符。加密的文件将包含各种没有意义的二进制垃圾。因此,第一个想法是简单地检查密码是否包含ASCII码<32或> 127的字符。

但是,这还不是万无一失的。有时人们也会使用更复杂的字符。如果有人输入Glāžšķūņu rūķīši作为密码,它仍然是某种语言的合法单词(在这种情况下为拉脱维亚语),但您可能会认为它是加密的。

这带给我们一个问题-列的字符集是什么?从一开始对我来说这就是一个可疑的地方,因为您是如何在其中存储普通文本和二进制垃圾的?闻起来像是某人不了解字符集,因为在正常情况下这样做会造成很大的混乱。

无论如何,如果utf-8文本存储在latin-1列中(一种常见情况),您现在就可以真正利用它了-所有不是 的单元格有效的utf-8字符串(以及包含字符<32的字符串)将被加密。

(但是,如果确实是这样,我强烈建议您尽快修复它,并确保从头到尾在所有地方都使用utf-8。这样可以减少很多麻烦。这里是mandatory reading整个字符集(东西)