【问题标题】:Making a Value of an Encrypted Field Unique使加密字段的值唯一
【发布时间】: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


【解决方案1】:

使用应用程序范围 bean 搜索提供的用户名。如果未找到新用户名,请使用新用户名创建用户。如果找到用户名,请向用户请求另一个用户名。由于只有一个地方执行此功能,因此不会有重复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多