Java JDK 8在KeyStore.load上使用SHA哈希算法安全吗?

Java JDK 8在KeyStore.load上使用SHA哈希算法安全吗?,java,security,java-8,cryptography,Java,Security,Java 8,Cryptography,JDK8在其类中使用SHA算法 从源代码中可以看出,在engineLoad期间(如果提供了密码),它会根据提供的密码生成SHA MessageDigest。如果代码正确,则密钥库的条目将提前使用密码签名。SHA Password MessageDigest用于检查完整性,方法是对每个条目将存储的哈希值与计算的哈希值进行比较 由于已知SHA在某些场景中不安全,因此运行时扫描程序会生成安全性结果。使用Java密钥库的软件(例如)可能会受到影响 我想知道这个安全问题实际上有多严重。可能的攻击向量是什么

JDK8在其类中使用SHA算法

从源代码中可以看出,在engineLoad期间(如果提供了密码),它会根据提供的密码生成SHA MessageDigest。如果代码正确,则密钥库的条目将提前使用密码签名。SHA Password MessageDigest用于检查完整性,方法是对每个条目将存储的哈希值与计算的哈希值进行比较

由于已知SHA在某些场景中不安全,因此运行时扫描程序会生成安全性结果。使用Java密钥库的软件(例如)可能会受到影响

我想知道这个安全问题实际上有多严重。可能的攻击向量是什么


我想听听其他人的评价。

JavaDoc特别指出,这样做的目的是

防止篡改密钥库

这一切都归结于您的安全目标是什么

因为众所周知,SHA是不安全的

SHA不是不安全的。这是一个过于简化的评估。它的速度太快,无法对密码进行哈希运算。对于许多其他用例来说,它是完全安全的

显然,密钥库不是密码,因此安全目标是不同的。密钥库是一个本地文件。通常,如果恶意用户可以物理访问您的计算机,那么这场战斗已经失败


在这种情况下,哈希的使用更多的是为了完整性和真实性,而不是其他任何东西。在这种情况下,SHA是一个不错的选择。

不,它绝对不安全。每当用密码加载Java KeyStore.jks时,都会使用它。然后,它通过读取的数据计算这个可怜的人的MAC,然后将其与存储的密码哈希进行比较

由于它只计算内容、密码和静态魔法字符串强大的Aphrodite上的SHA-1,因此简单地执行字典或彩虹表攻击非常容易。您甚至可以通过简单地首先计算数据并存储中间散列值来显著加快速度。因此,它并不是不安全的,因为它太多地使用损坏的SHA-1散列(尽管这也是一个问题),但因为它使恢复使用过的密码变得非常容易。如果使用具有高迭代计数的PBKDF2并在密码安全性不足时发出警告,则可以避免此问题

当前的SHA-1攻击仍然需要预先计算,我们可以假设密钥库内容通常不是由对手预先计算的。尽管如此,SHA-1的w.r.t.抗碰撞性能仍然不好,因此无法完全保证文件的完整性

我不认为长度扩展攻击会使情况变得更糟,因为在使用密码之前读取条目,所以幸运的是,针对这些条目,它应该是正常的。但是,替换密码根本不是问题,这可能用于社交攻击。您是否使用了错误的密码来保护它?也许你应该换个密码


请注意,在Java 9中,您应该使用比JKS更好的密钥存储,例如PKCS12密钥存储。

感谢您的输入。根据您的反馈,我重新表述了我的SHA声明。它对于许多其他用例都是完全安全的。?如果我们假设SHA意味着SHA-1并不完全安全/预映像和次映像电阻正常,但是,它不能防止碰撞。SHA-1从2011年左右的建议中删除,具有讽刺意味的是,这等于1997年、2011年的版权日期……在这种情况下,SHA是一个不错的选择。。。这也是一个过于简单的评估。这里使用的散列结构似乎是一种直接使用密码的即席MAC技术;它从未被分析过,没有专家的意见,没有理由相信它的安全性。我不是说它不安全,但是我没有看到任何分析来支持你的说法,那就是它是一个很好的选择…所以安全目标是不同的。。。这是真的,但是攻击者的1个进球是一样的;恢复未知密码。好吧,私钥是单独保护的,完整性保护仍然有一些用处。但是,没有充分保护密钥库的密码肯定是一个问题——可能是一个很大的问题。请继续提问。@JamesReinstateMonicaPolk这是一个API,需要阅读Java代码才能对其进行任何评估。我认为这实际上更好。在我看来,这是一个实用的编程问题,安全性与程序员JDK和软件算法常用的软件工具有关。在我看来,没有一个主题外的类别适用。PKCS12密钥库似乎至少在Java 6时就得到了开箱即用的支持。是的,但它们基本上缺乏功能,只接受带有证书链的私钥,如果我没有弄错的话,它在9中得到了修复。非常好,我相信正是这样。