encryption - SonarQube:确保加密数据在这里是安全的。AES/GCM/NoPadding、RSA/ECB/PKCS1Padding
问题描述
我正在使用:
1. RSA/ECB/PKCS1Padding
2. AES/GCM/NoPadding
在我的 Android (Java) 应用程序中加密我的数据。在 SonarQube 的文档中,它指出:
高级加密标准 (AES) 加密算法可用于各种模式。没有填充的伽罗瓦/计数器模式 (GCM) 应该优先于以下不安全的组合:
- 电子密码本(ECB)模式:在给定密钥下,任何给定的明文块总是被加密为相同的密文块。因此,它不能很好地隐藏数据模式。从某种意义上说,它没有提供严格的消息机密性,根本不建议在加密协议中使用它。
- 带有 PKCS#5 填充(或 PKCS#7)的密码块链接 (CBC) 容易受到填充预言攻击。
因此,正如推荐的那样,我使用AES/GCM/NoPadding
as :
Cipher c = Cipher.getInstance("AES/GCM/NoPadding");
但是,它仍然给我警告确保加密数据在这里是安全的。
相同的:
Cipher c = Cipher.getInstance("RSA/ECB/PKCS1Padding");
为什么SonarQube会发出该警告?这些用途不再安全了吗?
解决方案
GCM 模式下的 AES 作为分组密码算法进行保护。但这并不能保证使用 AES(在 GCM 模式下)加密数据的代码是安全的。有几件事可能会出错,使代码容易受到攻击。以正确的方式对其进行编码以获得所需的安全级别是开发人员的责任。一些可能出错的例子是:
- IV 对给定键重复
- 密钥或原始数据存储在
String
一直在堆中徘徊的数据类型中 - 密钥以明文形式存储在代码存储库中的属性文件中
等等。
现在,SonarQube 无法识别所有这些漏洞,因此他们提出了一个名为 Hotspot 的新概念,此处描述为:
与漏洞不同,安全热点不一定是容易受到攻击的问题。相反,安全热点突出显示需要手动审查的安全敏感代码片段。经过审查,您会发现需要修复的漏洞或不存在威胁。
热点有一个单独的生命周期,在上面给出的链接中进行了解释。
PS这个答案解释了如何以安全的方式在GCM模式下使用AES加密Java中的字符串:https ://stackoverflow.com/a/53015144/1235935
推荐阅读
- java - 是否可以使用字符串在java中调用原始文件?
- angular6 - Angular 的 FormControl 方法 markAsTouched 在测试用例中不起作用
- vue.js - Netlify 部署错误:无法导入模块“@nuxt/webpack”
- blockchain - 松露迁移需要太多时间
- canvas - 如何更改 PrimeFaces 和 Chart.js 中的轴字体
- javascript - 如何通过已经建立的 Websocket 连接发送 websocket 消息?
- c++ - 如果它后面没有一行,为什么排序不给我正确的值?
- azure - 如何使用 Azure 门户清除 Cosmos DB 数据库或删除所有项目
- json - 如何将 json 反序列化为对象而不将键指定为对象内的字段?
- python - tempfile.mkdtemp() 的权限被拒绝