用户名加密

标签 encryption

我需要加密从外部合作伙伴 SSO 收到的用户名。需要这样做,因为用户名是分配给学童的。但我们仍然需要能够跟踪每个人,以防止我们的系统被滥用,因此我们决定对日志等中的用户名进行加密。 这样,对我们系统的破坏就不会危及 child 的身份。

这就是我的困境。我在这方面的知识非常有限,因此我正在寻求有关使用哪种算法的建议。

我正在考虑使用非对称算法,例如 PGP,并丢弃其中一个 key ,这样我们就无法解密用户名。

我的问题:

  • 对于相同的输入,PGP 加密是否始终提供相同的输出?
  • PGP 是一个不错的选择吗?还是我们应该使用其他算法?
  • 是否有人有更好的建议来实现同样的目标 - 用户匿名化

最佳答案

如果您想要单向功能,则不需要加密。你想要散列。最简单的方法是使用 SHA-256 等哈希值。我建议在散列之前对用户名进行加盐处理。在这种情况下,我可能会选择一个静态盐,例如 edu.myschoolname: 并将其放在用户名前面。然后通过 SHA-256 运行它。将结果转换为 Base-64 或十六进制编码,并使用生成的字符串作为“用户名”。

从 unix 命令行来看,这看起来像:

$ echo -n "edu.myschoolname:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f0829f929e9180999582b09d898393989f9f9c9e919d95de959485" rel="noreferrer noopener nofollow">[email protected]</a>" | shasum -a 256
09356cf6df6aea20717a346668a1aad986966b192ff2d54244802ecc78f964e3  -

该输出对于该输入字符串是唯一的(从技术上讲,它不是“唯一的”,但您永远不会偶然或通过搜索发现冲突)。并且该输出是稳定的,因为对于给定的输入它总是相同的。 (我相信 PGP 包含一些随机化;如果没有,它应该包含在内。)


(关于下面的评论)

加密哈希算法对于其目的而言非常安全。非加密哈希算法并不安全(但也并非如此)。据我所知,没有针对 SHA-2(包括 SHA-256 和 SHA-512)的重大攻击。

您的系统需要对有权访问代码的人具有鲁棒性,这是正确的。然而,如果他们知道他们正在寻找什么用户 ID,那么没有系统会阻止他们发现该 ID 的屏蔽版本。如果您进行加密,则有权访问 key 的攻击者可以自己加密该值以找出它是什么。

但是,如果您要防止相反的情况:防止攻击者在不知道他们正在查找的 ID 的情况下确定 ID,则正确的解决方案是加密哈希,特别是 SHA-256 或 SHA-512。使用 PGP 创建单向函数就是使用加密原语来完成它并非旨在执行的操作,这始终是一个错误。如果您想要一个单向函数,那么您需要一个哈希值。

关于用户名加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53520080/

相关文章:

vba - 通过 VBA 以编程方式加密 Outlook 邮件

javascript - cryptoJS 解密/解密消息 AES CFB 模式

Node.js 内置加密货币 : RSA Decryption

encryption - VNC 定义了哪些协议(protocol)代码? (RFB 协议(protocol))

ruby-on-rails - 如何手动解密 Rails 5 session cookie?

android - IV 用于加密转换。预期 IV 长度为 16 但实际为 24

Rails 加密凭证功能的 Python 世界模拟(安全存储 secret )

iOS 社交框架和加密

java - 加密/隐藏部分源代码

Android 设备是否经过硬件加密?以编程方式