加密的电子邮件id不区分大小写MySQL



我需要使用不区分大小写的电子邮件ID登录。我的邮件ID以加密格式存储,我通过以下查询从数据库中获取:

$this->db->select('Name');
$this->db->from('users');
$this->db->where('emailId',"AES_ENCRYPT('{$emailId}','/*awshp$*/') ", FALSE);
$query = $this->db->get();
$result = $query->row();
return $result;

我使用二进制,但不使用

它有简单的逻辑,当您注册时,将电子邮件id的哈希值转换为小写后存储。登录时还将其转换为lowercase.so如果用户在任何情况下输入电子邮件id,则加密字符串匹配。

AES加密是一种双向算法,这意味着您可以恢复原始值,因此您还可以更新不符合要测试的格式的现有记录。

在数据库中运行更新后,只需应用Tim Biegeleisen提出的建议,就可以开始了。

更新现有记录的演示

mysql> CREATE TABLE t1 (
->   email VARBINARY(256)
->   );
Query OK, 0 rows affected (0.31 sec)
mysql> INSERT INTO t1 (email) VALUES 
-> (AES_ENCRYPT('MiXeDcAsEdEmAiL@gmail.com','salt')),
-> (AES_ENCRYPT('UPPERCASEDEMAIL@gmail.com','salt')),
-> (AES_ENCRYPT('lowercasedemail@gmail.com','salt'));
Query OK, 3 rows affected (0.09 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> UPDATE t1 SET email = AES_ENCRYPT(LOWER(CAST(AES_DECRYPT(email,'salt') AS CHARACTER)),'salt');
Query OK, 2 rows affected (0.11 sec)
Rows matched: 3  Changed: 2  Warnings: 0
mysql> SELECT CAST(aes_decrypt(email,'salt') AS CHARACTER) lower_cased from t1;
+---------------------------+
| lower_cased               |
+---------------------------+
| mixedcasedemail@gmail.com |
| uppercasedemail@gmail.com |
| lowercasedemail@gmail.com |
+---------------------------+
3 rows in set (0.00 sec)

NB不要忘记更改update语句以匹配您的列名和用作salt的值。

最新更新