java - 是否可以将哈希码限制为Java中的特定字符数

标签 java algorithm security md5 message-digest

我已经编写了一种使用 MD5 算法将纯文本转换为其哈希码的方法。请在下面找到我使用的代码。

public static String convertToMD5Hash(final String plainText){
            MessageDigest messageDigest = null;

            try {
                messageDigest = MessageDigest.getInstance("MD5");
            } catch (NoSuchAlgorithmException e) {
                LOGGER.warn("For some wierd reason the MD5 algorithm was not found.", e);
            }

            messageDigest.reset();
            messageDigest.update(plainText.getBytes());
            final byte[] digest = messageDigest.digest();
            final BigInteger bigInt = new BigInteger(1, digest);
            String hashtext = bigInt.toString(8);

            return hashtext;
}

此方法非常有效,但它会返回一个冗长的散列。我需要将此散列文本限制为 8 个字符。有没有可能在 Java 中设置哈希码的长度?

最佳答案

是和否。如果您总是将原始哈希字符串相似地剪切(即最后/第 8 个字符),则可以使用原始哈希的子字符串。你打算用那个“半哈希”做什么是另一回事。

无论您要做什么,请确保它与安全无关。

原因如下:MD5 是 128 位哈希,因此有 2^128 = ~340,000,000,000,000,000,000,000,000,000,000,000,000 种可能的排列。相当天文数字的排列使得暴力破解这种字符串几乎是不可能的。通过减少到 8 个字符,您将得到 32 位散列。这是因为单个十六进制值需要 4 位来表示(因此,也是 128 位/4 位 = 32 个十六进制值)。对于 32 位哈希,只有 2^32 = 4,294,967,296 种组合。这比原来的 128 位散列的安全性低大约 79,228,162,514,264,337,593,543,950,336 倍,并且可以用任何具有 80 年代计算器处理能力的旧计算机在几秒钟内破解。

关于java - 是否可以将哈希码限制为Java中的特定字符数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19905732/

相关文章:

java - 反转数组列表无法正常工作

java - java 1.6.013 中的 @WebServlet 注释支持

algorithm - visual c++在std::sort中使用什么排序算法

javascript - 使用 BFS (javascript) 查找最短路径未加权图

security - Docker 和保护密码

java - 如何发布和获取结果 - Java jsoup

java - 如何从 HashMap 中检索 List 对象并在自由标记模板中迭代?

algorithm - 来自一组区间的第 K 个最小值

asp.net - ASP.Net 与 SQL Server 中的数据安全

java - 如何将两个 ".jceks"文件合并为一个?