我需要通过 RSA 解密消息以便通过不安全的通道发送它,但我害怕Padding Oracle Attack。因此,我已经问了以下问题:
就像第一个问题中建议的那样,
但是,由于您使用的是高级加密库,因此您不必担心这一点。该图书馆的作者应该照顾它。
我不应该考虑。据我所知,RSA 的实现PKCS#1 v1.5
很容易受到Padding Oracale Attack
OAEP的影响(假设它已正确实现)
因此,我想知道javax.crypt.Cipher
Java 7使用了哪个填充实现
我需要通过 RSA 解密消息以便通过不安全的通道发送它,但我害怕Padding Oracle Attack。因此,我已经问了以下问题:
就像第一个问题中建议的那样,
但是,由于您使用的是高级加密库,因此您不必担心这一点。该图书馆的作者应该照顾它。
我不应该考虑。据我所知,RSA 的实现PKCS#1 v1.5
很容易受到Padding Oracale Attack
OAEP的影响(假设它已正确实现)
因此,我想知道javax.crypt.Cipher
Java 7使用了哪个填充实现
这取决于选择的或默认的提供程序,当您实例化 Cipher 而没有完全限定它时实际使用的填充,例如:
Cipher.getInstance("RSA")
这样做是一种不好的做法,因为如果您切换 Java 实现,可能会有不同的默认值,并且突然之间,您将不再与旧的密文兼容。始终完全限定密码。
正如我之前所说,默认值可能(有很多提供者,不能确定)是 PKCS#1 v1.5 填充。如果您需要另一个,则必须指定它。如果您想使用 OAEP,这里有一个完全限定的密码字符串:
Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
这不是密码学站点的第一个链接中给出的好建议。您永远不应该依赖加密库加密算法的默认值。这有很多原因:
由于历史原因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 的建议(在这个答案的第一个链接中)比密码算法更适合库中的协议实现。最后,无论您选择什么,您都应该能够捍卫所做选择的安全性。
当您指定时,bouncy-castle 的默认值RSA
是RSA/NONE/NOPADDING
这也是同样的结果RSA/ECB/NOPADDING
。