[英]convert openSSH rsa key to javax.crypto.Cipher compatible format
[英]Which padding is used by javax.crypto.Cipher for RSA
我需要通过 RSA 解密消息才能通过不安全的通道发送它,但我害怕Padding Oracle Attack 。 因此,我已经问了以下问题:
就像第一个问题中建议的那样,
但是,由于您使用的是高级加密库,因此您不必担心。 那个图书馆的作者应该照顾它。
我不应该考虑。 据我所知, PKCS#1 v1.5
的 RSA 实现容易受到Padding Oracale Attack
,而OAEP则没有(假设它已正确实现)
因此我想知道 Java 7 的javax.crypt.Cipher
使用了哪种填充实现
这取决于选择的或默认的提供程序,当您在不完全限定密码的情况下实例化密码时实际使用哪个填充,例如:
Cipher.getInstance("RSA")
这样做是一种不好的做法,因为如果您切换 Java 实现,可能会有不同的默认值,并且突然之间,您将不再与旧的密文兼容。 始终完全限定密码。
正如我之前所说,默认值可能(有很多提供者,不能确定)是 PKCS#1 v1.5 填充。 如果您需要另一个,则必须指定它。 如果你想使用OAEP,这里是一个完全合格的密码字符串在这里:
Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
这不是密码学站点的第一个链接中给出的好建议。 您永远不应该依赖加密库加密算法的默认值。 这有很多原因:
由于历史原因,Oracle 提供的SunJCEProvider
默认使用 PKCS#1 填充( "PKCS1Padding"
)(请参阅上面的原因 #2)。 这没有很好的记录。
当时设置了默认值,您基本上只有不安全的教科书 RSA( "NoPadding"
)和 PKCS#1 v1.5 版本( PKCS#1 v2.1 标准中的"PKCS1Padding"
或RSAES-PKCS1-v1_5
)。 当时RSAES-PKCS1-v1_5
绝对是更安全的选择。 现在将默认值更改为 OAEP 会破坏使用默认值的每个 RSA 实现。
otus 的建议(在本答案的第一个链接中)更适合库中的协议实现,而不是加密算法。 最后,无论您选择什么,您都应该能够捍卫所做选择的安全性。
当您只指定RSA
时,bouncy-castle 的默认值是RSA/NONE/NOPADDING
这也与RSA/ECB/NOPADDING
结果相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.