有没有办法只加密尚未加密的数据?



有没有办法只加密尚未加密的数据?(有什么方法可以区分加密和非加密数据?

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

加密代码

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。 问题是每个人都在数据库中添加数据,因此当数据保存在表中时,我有一个触发器(插入后(调用此存储过程以自动加密新数据。 谢谢

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

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

这就引出了一个问题 - 列的字符集是什么?这是一个从一开始就让我感到可疑的地方,因为您如何将普通文本和二进制垃圾存储在那里?闻起来像有人不理解字符集,因为在正常情况下这样做会造成很大的混乱。

无论如何,如果它是存储在拉丁语-1列中的utf-8文本(一种常见情况(,您现在可以使用它来发挥自己的优势 - 所有不是有效utf-8字符串的单元格(加上那些带有字符的单元格<32(将被加密。

(但是,如果真的是这种情况,我强烈建议您尽快修复它,并确保从头到尾到处都使用 utf-8。这样就不那么头疼了。这是关于整个字符集的必读内容(