java - 关于比较 MD5 哈希值

标签 java security

我不是安全专家,并且碰巧没有考虑太多,因为我的大多数应用程序都在本地 Intranet 上运行,所以谁 关心安全吗? :)

但实际上,我正在努力纠正它。

我已经在 glassfish 上设置了 JDBC 领域,并且现在使用来自互联网的代码通过 MD5 散列保存我的密码。

public static String getMD5(String input) 
{
    try
    {
      MessageDigest md = MessageDigest.getInstance("MD5");
      md.update(input.getBytes());

      byte byteData[] = md.digest();

      //convert the byte to hex format method 1
      StringBuffer sb = new StringBuffer();
      for (int i = 0; i < byteData.length; i++)
      {
        sb.append(Integer.toString((byteData[i] & 0xff) + 0x100,
                                   16).substring(1));
      }
      return sb.toString();
    }
    catch (NoSuchAlgorithmException e)
    {
      throw new RuntimeException(e);
    }
}

现在我的问题是,在更改密码用例期间...是否只是比较哈希值是否等于验证密码 输入的内容与我的数据库中的内容相同,如下面的代码?

public static void main(String[] args)
throws NoSuchAlgorithmException
{
String currentPassword = "java";
String inputValue = "java1";

String string1 = getMD5(currentPassword);
String string2 = getMD5(inputValue);

System.out.println("Is equal = " + string1.equals(string2));
}

我在某处读到 MD5 是一种单向散列,因此我无法将密码解密回字符串?

抱歉,如果我的问题太简单但我只是想确认我的理解?

谢谢

最佳答案

相同的密码将始终散列为相同的值,因此您可以进行您正在讨论的检查。此外,一般来说,哈希函数不能反转。也就是说,给定某个密码的哈希值,您无法根据给定的哈希值推断出密码。然而MD5 has been broken ,因此您应该使用其他哈希函数(例如 SHA-256)。还值得注意的是,为了真正安全地做到这一点,您应该在散列密码之前对密码进行加盐,以防止彩虹表攻击。

关于java - 关于比较 MD5 哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10221606/

相关文章:

java - ANTLR 歧义语法?

javascript - 如何保存WebView应用程序的登录信息?

linux - Linux Dev 上的 Subversion 存储库

c# - 为 RSA SecurID 开发的困难

c - 根据程序的标准输出将二进制数据传递到程序的标准输入

reactjs - 在 React 应用程序中使用 API key

java - 在 Spring 中,@Profile 和 @ActiveProfiles 有什么区别

java - 在 Java 8 流中按属性排序

java - 在哪里可以找到 Microsoft Java API 文档

c# - 用户无法轻易入侵的 Windows 应用程序的安全数据库后端