2012-04-19 135 views
2

我不是安全专家,因为我的应用程序大部分在本地Intranet上运行,所以谁在关心安全性? :)关于比较MD5哈希值

但实际上,我正在努力使其正确。

我在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); 
    } 
} 

现在的问题是,在更改密码的使用情况......是它只是比较,如果哈希是相等的验证,如果输入的密码 是什么在我的DB像下面这段代码一样吗?

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是一种单向哈希,所以我不能解密回密码字符串?

对不起,如果我的问题太简单了,但我只想确认我的理解?

感谢

回答

3

相同的密码总是返回相同的值,所以你可以做你所谈论的检查。另外,通常散列函数不能颠倒。也就是说,给定一个密码的散列,你不能推断给定散列的密码。但是MD5 has been broken,所以你应该使用一些其他的散列函数(如SHA-256)。同样值得注意的是,要真正做到这一点,你应该先密码,然后再对它们进行哈希以防止彩虹桌攻击。

1

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

你也正确地提到MD5是单向散列,因此你将无法将它转换回原始字符串。但是,这并不能阻止攻击者对普通密码执行字典攻击。您可能想要向应用程序引入一个salt来提高安全性。这样,如果您的数据库受到攻击,攻击者将不得不发现盐是什么,这将打败琐碎的字典攻击。

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

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

+0

有观点认为,密码文件可能会受到影响,但不是盐是可笑的。盐的目的是防止预先计算的攻击。没有单独的随机盐,攻击者需要单独攻击每个密码。如果没有盐,密码可以用彩虹表简单地破解(假设密码是计算出的形式)。如果在这个答案中使用恒定的种子,则所有使用该软件的密码都可以立刻受到攻击。妥协后,软件将需要修改和重建(你想确保在危机中做到这一点?)。 – 2012-04-19 11:32:19

+0

我同意上面的实现需要更改以随密码一起存储随机盐。然而,我确实认为有另一种输入 - 输入的另一种程度的随机性 - 确实增加了另一个安全屏障。在没有Web服务器的情况下,数据库是否会受到威胁?还是可能会有SQL注入漏洞暴露数据库的内容?在这种特殊情况下,增加这个额外的秘密意味着攻击者也必须将网络实例损害到数据库内预先编译好的值。 – 2012-04-19 14:52:09

+0

感谢您的补充信息David! – 2012-04-20 01:17:20