【发布时间】:2020-01-10 00:23:18
【问题描述】:
JavaEE 应用程序使用 Jasypt 简单加密器来加密使用 JPA 存储在 MySQL 数据库中的用户名。
由于用户名已加密,因此无法使用户名列唯一。 (请参阅下面的用例。)
可以在保存新用户名之前执行搜索以避免重复,但理论上存在同时创建多个用户名的可能性。
Encrypt('username','key') = 'EncryptedUsername'
Decrypt('EncryptedUsername','key') = 'username'
案例 1 - 已经在数据库中
用户名1 = 'a'
Key1 = '1'
EncryptedValue1 = 'XXXX'(假设)
案例 2 - 要添加新用户名
用户名2 = 'b'
Key2 = '2'
EncryptedValue2 = 'XXXX'(假设)
案例 3 - 要添加另一个新用户名
用户名3 = 'a'
Key3 = '3'
EncryptedValue3 = 'YYYY'(假设)
必须允许情况 2。
第三种情况不允许
我无法通过使我存储加密值的字段唯一来实现这一点。
如果我将其设为唯一,则在情况 2 中将不允许添加新用户名“b”。这是错误的,因为现有用户名“a”与新用户名“b”不同。
在第 3 种情况下,它还允许添加“a”作为用户名,因为加密的值不同。
我们如何确保用户名在加密后仍然是唯一的?
【问题讨论】:
-
为什么不能是唯一的?
-
当
encrypt('a') = 'x'和encrypt('b') = 'x'- 什么是decrypt('x')? -
@BuddhikaAriyaratne:那么用户名本身不是唯一的(a 和 b)......而且两者都导致加密“x”的机会几乎没有......我对你的印象问题是:当
encrypt('a', 'key1') = 'x'和encrypt('a', 'key2') = 'y'时,如何防止 a 被使用两次,因为在数据库中条目是唯一的 -
但是密钥存储在哪里?在您编写“可以在保存新用户名以避免重复之前执行搜索”时,您将如何执行重复检查?
-
"我使用 MySQL 行的 id 作为键" - 这很“有趣”。听起来像是混淆而不是加密。
标签: mysql jpa encryption jasypt