My-*_*-Is 7 java security cryptography rsa padding-oracle-attack
我需要通过RSA解密消息,以便通过不安全的通道发送消息,但我害怕Padding Oracle Attack.因此我已经问过以下问题:
像第一个问题中建议的那样,
但是,由于您使用的是高级加密库,因此您不必担心这一点.该图书馆的作者应该照顾它.
我不应该考虑.据我所知,RSA执行的PKCS#1 v1.5
是脆弱的Padding Oracale Attack
,其中原和不(假设它的正确实施)
因此,我想知道javax.crypt.Cipher
Java 7 使用哪种填充实现
Art*_* B. 12
它取决于所选择的或默认的提供程序,当您实例化一个密码而没有完全限定它时,实际使用哪个填充:
Cipher.getInstance("RSA")
Run Code Online (Sandbox Code Playgroud)
这样做是一种不好的做法,因为如果你切换Java实现,可能会有不同的默认值,突然间,你将不再与旧的密文兼容.始终完全符合密码.
正如我之前所说,默认可能(有许多提供商,一个不能确定)是PKCS#1 v1.5填充.如果您需要另一个,则必须指定它.如果你想使用OAEP,这里是一个完全合格的密码字符串在这里:
Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
Run Code Online (Sandbox Code Playgroud)
在加密站点的第一个链接中,这不是一个好建议.您永远不应该依赖加密库加密算法的默认值.这有很多原因:
由于历史原因SunJCEProvider
,Oracle提供的默认值为PKCS#1 padding("PKCS1Padding"
)(参见上面的原因#2).这没有很好的记录.
那时设置了默认值,你基本上只有不安全的教科书RSA("NoPadding"
)和PKCS#1 v1.5版本("PKCS1Padding"
或 RSAES-PKCS1-v1_5
PKCS#1 v2.1标准).当时RSAES-PKCS1-v1_5
绝对是更安全的选择.现在将默认值更改为OAEP会破坏使用默认值的每个RSA实现.
otus的建议(在本答案的第一个链接中)更适合于库中的协议实现而不是加密算法.最后,无论你选择什么,你都应该能够捍卫所做选择的安全性.