我正在使用:
1. RSA / ECB / PKCS1Padding
2. AES / GCM /无填充
在我的Android(Java)应用程序中加密我的数据。在SonarQube 的文档中指出:
高级加密标准(AES)加密算法可用于各种模式。不带填充的Galois /计数器模式(GCM)应优先于以下不安全的组合:
电子密码本(ECB)模式:在给定密钥下,任何给定的明文块始终被加密为相同的密文块。因此,它不能很好地隐藏数据模式。从某种意义上说,它不提供严格的消息机密性,并且完全不建议在加密协议中使用它。
具有PKCS#5填充(或PKCS#7)的密码块链接(CBC)易受填充oracle攻击。
因此,根据建议,我AES/GCM/NoPadding
用作:
Cipher c = Cipher.getInstance("AES/GCM/NoPadding");
但是,它仍然会警告我确保此处加密数据是安全的。
相同的:
Cipher c = Cipher.getInstance("RSA/ECB/PKCS1Padding");
SonarQube为什么会发出该警告?这些用途不再安全吗?
GCM模式下的AES作为分组密码算法得到保护。但这不能保证使用AES加密数据的代码(在GCM模式下)是安全的。有些事情可能会出错,从而使代码容易受到攻击。开发人员有责任以正确的方式对其进行编码以获得所需的安全级别。可能出错的一些示例是:
IV不是随机的。这是可以预见的。
密钥或原始数据以String
数据类型存储,该数据类型一直存在于堆中
密钥以明文形式存储在代码存储库中的属性文件中
等等。
现在,SonarQube无法识别所有这些漏洞,因此,他们提出了一个称为“热点”的新概念,此处描述为:
与漏洞不同,安全热点不一定是容易受到攻击的问题。相反,安全热点突出显示了需要手动检查的安全敏感代码段。经过审查,您会发现需要修复的漏洞或没有威胁。
热点具有单独的生命周期,在上面的链接中对此进行了说明。
PS此答案说明了如何以安全方式在GCM模式下使用AES在Java中加密字符串:https : //stackoverflow.com/a/53015144/1235935