关于比较MD5哈希

时间:2012-04-19 04:23:41

标签: 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是单向散列的地方,所以我无法将密码解密回字符串?

很抱歉,如果我的问题太简单了,但我想确认一下我的理解?

由于

2 个答案:

答案 0 :(得分:2)

相同的密码将始终散列到相同的值,因此您可以执行您正在讨论的检查。而且,通常,哈希函数不能被反转。也就是说,给定一些密码的哈希值,您无法推断给定哈希值的密码。但是MD5 has been broken,所以你应该使用一些其他的哈希函数(比如SHA-256)。同样值得注意的是,要真正安全地执行此操作,您应该在密码之前对密码加密,以防止彩虹表攻击。

答案 1 :(得分:0)

是的,给定相同的输入字符串,哈希将计算为相同的值。这将使您能够在数据库中存储哈希而不是明文密码。你提到你可以比较两个哈希来确定输入字符串是否相等是正确的。

你也提到MD5是一种单向哈希,所以你将无法将其转换回原始字符串。但是,这并不能阻止攻击者对常见密码执行字典攻击。您可能希望在应用程序中引入salt以获得额外的安全性。这样,如果您的数据库遭到入侵,攻击者还必须发现盐是什么,这将打败琐碎的字典攻击。

 return getMd5("myS3cre7V4lu3" + inputValue) == getMd5(valueRetrievedFromDatabase) 

http://en.wikipedia.org/wiki/Salt_(cryptography)