我目前正在为 Android 编写一个基于 RSA 的身份验证应用程序,即使您可以物理访问没有锁屏/PIN 的手机,也应该无法复制。
但是,由于 bouncycastle 实现中的错误,手机内部的 HSM 确保私钥永远不会离开存储,只能“使用”,仅支持 PKCS 1.5 填充。
加密的消息每次都会不同(随机数),因此不可能观察到两个加密消息在网络上是相同的。
攻击者或对手虽然无法访问手机,但也无法访问填充预言机。该应用程序的工作原理是让用户扫描一个加密的 QR,然后这个加密的 QR 解密成一个 OTP 代码。是的,攻击者可以在网络钓鱼页面或被劫持的连接上显示包含填充错误的二维码,并观察用户是否继续进行身份验证(输入有效的 OTP),但我在某些页面上读到的是填充预言攻击需要对填充进行数百万次“测试”。
当攻击者或对手确实可以访问手机时,攻击者可以将手机本身用作填充预言机,而且,当可以访问手机时,攻击者仍然可以使用该应用程序解密任意消息。
必须满足的安全目标是:
虽然攻击者无权访问手机,但攻击者应该无法进行身份验证。
如果攻击者确实可以访问手机,即使是很长时间,他也应该能够进行身份验证,但不能提取私钥。
当攻击者不再有权访问电话时,例如,如果攻击者是之前被解雇的员工,然后上交了电话,则攻击者应该不再能够进行身份验证,即使他以前确实有权访问手机,即使安全硬件内部的密钥对也没有改变。
在此页面上,答案提到可以通过安装填充预言攻击来提取私钥: OAEP 在 RSA 中解决了哪些特定的填充弱点?
但是,维基百科页面没有提到私钥的泄露:https ://en.wikipedia.org/wiki/Padding_oracle_attack
但是维基百科页面提到,使用填充预言,攻击者能够通过检查填充预言回复来解密任意消息,而无需访问解密引擎的密钥或明文输出。但是,在这种情况下,当攻击者确实可以访问填充预言时,攻击者也可以访问明文输出,反之亦然,这意味着当攻击者确实可以访问解密引擎时,已经可以解密任意消息,而不必诉诸填充预言机攻击。
这两件事是完全不同的,因为有了私钥,攻击者可以在他不再访问 padding oracle 的情况下进行解密,但是如果 padding oracle 只能用于解密消息,那么 padding oracle 就变得无用了在这种情况下对攻击者来说,因为当攻击者不再具有padding oracle访问权限时,他就无法再进行解密,并且达到了安全目标。
我的问题是:
1:在这种情况下使用PKCS 1.5安全吗?
2:真的可以使用填充预言提取私钥,还是填充预言只允许任意消息解密?两篇链接的文章在这方面模棱两可。