有没有办法只加密尚未加密的数据?(有没有办法区分加密和未加密的数据?)
请假设我有一个列,其中一些数据已经加密,但有些数据没有加密。
加密代码
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。问题是每个人都在数据库中添加数据,所以当数据保存在表中时,我有一个触发器(在insert之后),它调用这个存储过程来自动加密新数据。谢谢
发布于 2018-09-13 06:57:54
在一般情况下-不,你不能区分加密和非加密数据。Buuut,看看你的例子,也许我们可以更接近。未加密的密码将具有“普通”字符,人们可以在键盘上键入。加密后的文件将包含各种没有意义的二进制垃圾。因此,第一个想法是简单地检查密码是否包含ASCII代码<32或>127的字符。
然而,这还不是最简单的。有时人们也会使用更复杂的字符。如果有人输入Glāžšķūņu rūķīši作为他们的密码,它在某些语言中仍然是合法的单词(在本例中是拉脱维亚语),但您可能会认为它是加密的。
这就引出了一个问题--该列的字符集是什么?这是一个我从一开始就觉得可疑的地方,因为你是如何在这里存储普通文本和二进制垃圾的?闻起来好像有人不理解字符集,因为在正常情况下这样做会造成很大的混乱。
无论如何,如果它是存储在拉丁-1列中的utf-8文本(一种常见的情况),您现在实际上可以使用它-所有不是有效的utf-8字符串的单元格(加上那些字符<32的单元格)都将被加密。
(但是,如果真的是这样,我强烈建议您尽快修复它,并确保从头到尾到处都使用utf-8。这样就不会那么头疼了。这里是关于整个字符集的mandatory reading )
https://stackoverflow.com/questions/52304074
复制相似问题