使用UUID为特定字符串生成唯一标识符是否安全(在唯一性方面)?

时间:2015-02-04 14:37:27

标签: java hash uuid sha256

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);

你觉得哪个更适合我的问题?

1 个答案:

答案 0 :(得分:4)

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

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

请注意,在 的情况下,我会通过StandardCharsets使用固定编码将字符串转换为文本。不要使用平台默认设置(根据您的第一个代码段),而不是StandardCharsets优于魔术字符串值(根据您的第二个代码段)。