【问题标题】:MySQL 8 AES_ENCRYPT() & AES_DECRYPT(). Correct inplementation?MySQL 8 AES_ENCRYPT() 和 AES_DECRYPT()。正确执行?
【发布时间】:2020-09-03 18:07:01
【问题描述】:

我想知道 AES_ENCRYPT 和 AES_DECRYPT 在 MySQL 8 中的正确实现。

我有一个包含字段ownerIdVARCHAR(16) 和ownerPassword(BLOB) 的表。

1.我们将一条记录插入到表中 01_tblCompany 使用MySQL 的AES_ENCRYPT() 函数来加密ownerPassword 字段,如下所示:

INSERT INTO 01_tblCompany (ownerId, ownerPassword) VALUES ('owner001', AES_ENCRYPT('password123', 'privateKey'));

2。我们从表中选择这条记录 01_tblCompany 使用MySQL AES_DECRYPT() 函数来解密ownerPassword 字段,如下所示:

SELECT AES_DECRYPT(ownerPassword, 'privateKey') AS ownerPassword FROM 01_tblCompany WHERE ownerId = 'owner001';

MySQL page for the AES Encryption function 声明您不应该只将纯文本 privateKey 交给key_str 参数,并且

将密钥传递给 key_str 参数的最安全方法是创建 一个真正随机的 128 位值并将其作为二进制值传递。

我想那是我的头发开始冒烟的时候,我希望有人能展示正确实施的完整示例?

【问题讨论】:

  • 使用页面上的示例。它有你需要的一切

标签: mysql encryption


【解决方案1】:

好的。这就是我们使用 MySQL 的默认 block_encryption_modeaes-128-ecb 使用 AES_ENCRYPT()AES_DECRYPT() 插入和选择字段的方式。

block_encryption_mode 变量控制块加密模式

默认设置为aes-128-ecb。 ECB 模式对数据库很有用,因为它不需要 IV,因此存在 1:1 的密文:明文关系。

请注意,我们从未真正使用 AES_DECRYPT() 来解密存储在数据库中的密码。您应该对用户密码一无所知。

相反,我们使用正确的密码来加密用户的输入尝试。

如果两个加密值匹配,那么我们就成功登录了。

/* ANALYSIS */
SELECT SHA2('privateKey',512);
SELECT LENGTH(SHA2('privateKey',512));
SELECT UNHEX(SHA2('privateKey',512));
SELECT LENGTH(UNHEX(SHA2('privateKey',512)));

/* INSERT ONWER */
INSERT INTO 01_tblCompany (ownerId, ownerPassword) VALUES ('owner001', AES_ENCRYPT('password123', UNHEX(SHA2('privateKey',512))));

/* SELECT ONWER */
SELECT ownerId, ownerPassword FROM 01_tblCompany WHERE ownerId = 'owner001' AND ownerPassword = AES_ENCRYPT('password123', UNHEX(SHA2('privateKey',512)));

/* INSERT USER */
INSERT INTO 02_tblCompanyUsers (ownerId, userName, userPassword) VALUES ('owner001', 'user001', AES_ENCRYPT('password123', UNHEX(SHA2('privateKey',512))));

/* SELECT USER */
SELECT ownerId, userName, userPassword FROM 02_tblCompanyUsers WHERE userName = 'user001' AND userPassword = AES_ENCRYPT('password123', UNHEX(SHA2('privateKey',512)));

【讨论】:

  • 请注意,这不是验证用户密码的正确方法。正确执行时,将使用密码哈希(使用 PBKDF、bcrypt 或 Argon2 算法)。在密码上使用 ECB 是危险的,因为它会泄露相同的块,从而泄露有关(部分)相同密码的信息。将密钥存储到 SQL 查询中也很危险。您可能无法解密,但是是什么让对手无法解密密码?
  • 我喜欢你所说的。那么,AES CBC?我目前正在使用 Digital Ocean Managed Database,但更改默认 block_encryption_mode 似乎无法使用管理员帐户执行。我读过 CBC 的计算量更大,但这只会在登录期间发生。 privateKey 可以使用 php include 插入到查询中,猜测 IV 也是?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 2013-05-09
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多