繁体   English   中英

javax.crypto.Cipher 对 RSA 使用哪种填充

[英]Which padding is used by javax.crypto.Cipher for RSA

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

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

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

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

我不应该考虑。 据我所知, 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");

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

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

由于历史原因,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM