Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于比较MD5哈希_Java_Security - Fatal编程技术网

Java 关于比较MD5哈希

Java 关于比较MD5哈希,java,security,Java,Security,我不是安全专家,碰巧也没怎么考虑,因为我的大部分应用程序都运行在本地内部网上,所以谁呢 关心安全吗?:) 但事实上,我正在努力使它正确 我已经在glassfish上设置了JDBC领域,现在我正在使用互联网上的代码通过MD5哈希保存密码 public static String getMD5(String input) { try { MessageDigest md = MessageDigest.getInstance("MD5"); md.updat

我不是安全专家,碰巧也没怎么考虑,因为我的大部分应用程序都运行在本地内部网上,所以谁呢 关心安全吗?:)

但事实上,我正在努力使它正确

我已经在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);
    }
}
我在某个地方读到,MD5是单向散列,所以我无法将密码解密回字符串

对不起,如果我的问题太简单,但我想确认一下我的理解


谢谢

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

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

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

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

密码文件可能会被泄露,但盐却不会被泄露的想法是可笑的。salt的目的是防止预计算攻击。如果没有单独的随机密码,对手将需要单独攻击每个密码。如果没有盐,密码可以用彩虹表(假设密码的形式是计算的)简单地破解。在这个答案中,使用一个恒定的种子,所有使用该软件的密码都可以同时受到攻击。在妥协之后,软件将需要修改和重建(你想确保在危机中做到这一点吗?)。我同意上述实现需要更改,以存储随机盐和密码。然而,我确实认为有另一个输入——输入中的另一个随机度——确实增加了另一个安全障碍。如果没有web服务器,数据库可能会被破坏,或者可能会有SQL注入错误暴露数据库的内容吗?在这种情况下,添加这个额外的秘密意味着攻击者还必须将web实例泄露给数据库中的预编译值。感谢添加的信息David!没问题,很高兴我能多贡献一点。正如Tom提到的,在密码旁边存储salt更安全,但是将哈希直接存储到数据库中也有一些问题:)
 return getMd5("myS3cre7V4lu3" + inputValue) == getMd5(valueRetrievedFromDatabase)