【问题标题】:Is it safe (in matter of uniqueness) to use UUID to generate a unique identifier for specific string?使用 UUID 为特定字符串生成唯一标识符是否安全(就唯一性而言)?
【发布时间】:2015-04-04 03:07:49
【问题描述】:
String myText;
UUID.nameUUIDFromBytes((myText).getBytes()).toString();

我正在使用上面的代码来生成特定文本的代表。 例如,“Moien”应该始终用“e9cad067-56f3-3ea9-98d2-26e25778c48f”表示,而不是像项目重建这样的任何更改都应该能够更改该 UUID。

我这样做的原因是我不希望那些特定的文本对人类来说是可读的(可理解的)。

注意:我不需要在散列后重新生成正文(例如“Moien”)。

我也有另一种方法:

            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] hash = digest.digest((matcher.group(1)).getBytes("UTF-8"));
            String a = Base64.encode(hash);

你认为哪种方法更能解决我的问题?

【问题讨论】:

  • “是我不希望那些特定的文本对人类来说是可读的(可理解的)。” - 为什么?这让我很担心,因为这可能意味着您使用的是 encoding 而不是 encryption
  • 前者使用MD5而不是SHA-256,但结果是等价的:它为(实际上)无限源集提供有限集的值,试图使冲突不太可能但并非不可能.换句话说,正如您的问题标题所要求的那样,它不是“安全的(就唯一性而言)”。如果你想完全排除冲突,散列不是正确的工具。
  • 他不是在寻找编码,而是在寻找哈希。
  • @dkatzel 例如,我需要检查 A 是否等于 B。但如果不是,我不希望 B 知道 A 的实际值是多少,反之亦然。所以我用一些单向散列将 A 和 B 转换为一个字符串,然后检查散列的字符串是否相等。

标签: java hash uuid sha256


【解决方案1】:

UUID.nameUUIDFromBytes 似乎基本上只是 MD5 散列,结果表示为 UUID。

明确使用 base64 编码的哈希对我来说感觉更清楚,部分原因是您可以控制使用哪个哈希 - 如果冲突带来任何类型的安全风险,这可能是相关的。 (出于这个原因,SHA-256 可能比 MD5 更好。)当然,字符串会比 SHA-256 更长,但希望这不是问题。

请注意,在 任何一种情况下,我都会通过StandardCharsets 使用固定编码将字符串转换为文本。不要使用平台默认值(根据您的第一个 sn-p)并且更喜欢 StandardCharsets 而不是魔术字符串值(根据您的第二个 sn-p)。

【讨论】:

    猜你喜欢
    • 2016-12-27
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多