12

我需要通过 RSA 解密消息以便通过不安全的通道发送它,但我害怕Padding Oracle Attack。因此,我已经问了以下问题:

  1. 如何验证 RSA 加密消息的完整性?
  2. 如何使用 javax.crypto.Cipher 确保 RSA 密码的消息完整性

就像第一个问题中建议的那样,

但是,由于您使用的是高级加密库,因此您不必担心这一点。该图书馆的作者应该照顾它。

我不应该考虑。据我所知,RSA 的实现PKCS#1 v1.5很容易受到Padding Oracale AttackOAEP的影响(假设它已正确实现)

因此,我想知道javax.crypt.CipherJava 7使用了哪个填充实现

4

3 回答 3

18

这取决于选择的或默认的提供程序,当您实例化 Cipher 而没有完全限定它时实际使用的填充,例如:

Cipher.getInstance("RSA")

这样做是一种不好的做法,因为如果您切换 Java 实现,可能会有不同的默认值,并且突然之间,您将不再与旧的密文兼容。始终完全限定密码。

正如我之前所说,默认值可能(有很多提供者,不能确定)是 PKCS#1 v1.5 填充。如果您需要另一个,则必须指定它。如果您想使用 OAEP,这里有一个完全限定的密码字符串

Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
于 2015-08-16T10:11:59.793 回答
8

这不是密码学站点的第一个链接中给出的好建议。您永远不应该依赖加密库加密算法的默认值。这有很多原因:

  1. 不同的实现,不同的默认值(对密码学提供者没有关于默认值的要求,尽管大多数会复制 Oracle/Sun 的默认值);
  2. 现在安全的东西明天可能不会被认为是安全的,因为为了向后兼容,您永远不能更改默认值;
  3. 阅读您的软件的任何人都不清楚默认值是什么(您可以记录它,但在这种情况下,您最好把它写出来)。

由于历史原因SunJCEProvider,Oracle 提供的默认值为 PKCS#1 填充 ( )(参见上面的原因 #2)。"PKCS1Padding"这没有很好的记录。

那时设置默认值,您基本上只有不安全的教科书 RSA ( "NoPadding") 和 PKCS#1 v1.5 版本("PKCS1Padding"RSAES-PKCS1-v1_5在 PKCS#1 v2.1 标准中)。那个时候RSAES-PKCS1-v1_5绝对是比较稳妥的选择。现在将默认值更改为 OAEP 会破坏所有使用默认值的 RSA 实现。

otus 的建议(在这个答案的第一个链接中)比密码算法更适合库中的协议实现最后,无论您选择什么,您都应该能够捍卫所做选择的安全性。

于 2015-08-16T10:12:10.393 回答
0

当您指定时,bouncy-castle 的默认值RSARSA/NONE/NOPADDING

这也是同样的结果RSA/ECB/NOPADDING

于 2020-03-27T18:13:48.130 回答