2

我不是安全专家,并且碰巧没有考虑太多,因为我的大多数应用程序都在本地 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 是一种单向哈希,所以我无法将密码解密回字符串?

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

谢谢

4

2 回答 2

2

相同的密码将始终哈希为相同的值,因此您可以进行您正在谈论的检查。此外,通常哈希函数不能反转。也就是说,给定某个密码的哈希值,您无法推断给定哈希值的密码。但是MD5 已被破坏,因此您应该改用其他一些哈希函数(如 SHA-256)。还值得注意的是,要真正安全地执行此操作,您应该在散列密码之前对密码进行加盐,以防止彩虹表攻击。

于 2012-04-19T04:26:49.417 回答
0

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

您也正确地提到 MD5 是一种单向哈希,因此您将无法将其转换回原始字符串。但是,这并不能阻止攻击者对常用密码进行字典攻击。您可能希望在应用程序中引入盐以增加安全性。这样,如果您的数据库遭到破坏,攻击者还必须发现盐是什么,这将击败微不足道的字典攻击。

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

http://en.wikipedia.org/wiki/Salt_(密码学)

于 2012-04-19T04:47:08.127 回答