如何将用户名存储在GDPR下的数据库中?

时间:2018-11-14 16:48:20

标签: database

这不是How to handle emails as usernames under GDPR?的副本,因为我的问题与性能有关。

我有一个要符合GDPR的应用程序。

我存储个人信息的策略是对它进行加密,但是我很难弄清楚如何处理用户名。

我一直在搜索其他问题,例如this one,但找不到与我同样的问题。

我的问题与如何存储和验证数据库中的用户名有关。

我正在考虑的方法是包含三列:

  1. username_encrypted(加密密钥将在数据库外部,数据库将无法访问它)
  2. username_hash:哈希(用户名+盐)

当我想以纯文本格式检索用户名时,我得到了username_encrypted并且对其进行了解密。

当我要验证用户名时,对于数据库中的每个用户,我必须选项1

  1. 使用用户salt(每个用户的salt不同)来计算哈希(hash(username + salt))
  2. 将上一点的结果与username_hash列进行比较

所以,我的问题是:是否有另一种方法可以在不计算所有用户哈希值的情况下实现同一目标?对于较小的数据库,这可能不是问题。但是对于更大的数据库,这可能会产生很大的影响。

如果相关,我正在使用的数据库是PostgreSQL。

验证用户名选项2 (请参见下面的Nosajimiki答案/评论):

  1. 为所有用户设置一个全局盐,并且使用全局盐来计算username_hash列
  2. 计算哈希(哈希(用户名+ global_salt))
  3. 将上一行的结果与username_hash列进行比较

1 个答案:

答案 0 :(得分:2)

您可以像使用密码一样处理它。登录名用站点范围的盐进行哈希处理时,可以像密码一样进行检查;您只需要验证它,就不需要查询它。

这不是说密码存储的最佳实践,因为您经常会发现很多人使用相同的密码,但是对于用户名,站点范围内的Salt不应暴露任何额外的漏洞,因为它们应该都是唯一的。

如果您需要在登录后显示用户名。为此,您可以将用户键入的用户名保存为登录变量,作为会话变量,然后再进行哈希处理。通过这种方式,会话在您登录后就一直记住您是JohnSmith101,但是数据库仅知道您的哈希。