安卓应用安全指南 5.6.2 密码学 规则书
5.6.2 密码学 规则书
原书:Android Application Secure Design/Secure Coding Guidebook
译者:飞龙
使用加密技术时,遵循以下规则:
5.6.2.1 指定加密算法时,请显式指定加密模式和填充(必需)
在使用加密技术和数据验证等密码学技术时,加密模式和填充必须显式指定。 在 Android 应用开发中使用加密时,你将主要使用java.crypto
中的Cipher
类。 为了使用Cipher
类,你将首先通过指定要使用的加密类型,来创建Cipher
类对象的实例。 这个指定被称为转换,并且有两种格式可以指定转换:
- 算法/模式/填充
- 算法
在后一种情况下,加密模式和填充将隐式设置为 Android 可以访问的加密服务供应器的适当默认值。 这些默认值优先考虑便利性和兼容性而选择,并且在某些情况下可能不是特别安全的选择。 为此,为了确保正确的安全保护,必须使用两种格式中的前者,其中显式指定了加密模式和填充。
5.6.2.2 使用强算法(特别是符合相关标准的算法)(必需)
使用加密技术时,选择符合特定标准的强算法很重要。 此外,在算法允许多个密钥长度的情况下,重要的是要考虑应用的整个产品生命周期,并选择足以确保安全性的密钥长度。 此外,对于一些加密模式和填充模式,存在已知的攻击策略;对这些威胁做出有力的选择是非常重要的。
确实,选择弱加密方法会造成灾难性后果。 例如,被加密来防止第三方窃听的文件,实际上可能仅受到无效保护,并且可能允许第三方窃听。 由于 IT 的不断进步导致加密分析技术的持续改进,因此至关重要的是,考虑并选择一个算法,它能够在运行的整个期间,保证安全性。在此时间,你希望应用保持运行。
实际加密技术的标准因国家而异,详见下表(单位:位)。
表 5.6-1 NIST(USA) NIST SP800-57
算法生命周期 | 对称密钥加密 | 非对称密钥加密 | 椭圆曲线加密 | HASH(数字签名) | HASH(随机数生成) |
---|---|---|---|---|---|
~2010 | 80 | 1024 | 160 | 160 | 160 |
~2030 | 112 | 2048 | 224 | 224 | 160 |
2030~ | 128 | 3072 | 256 | 256 | 160 |
表 5.6-2 ECRYPT II (EU)
算法生命周期 | 对称密钥加密 | 非对称密钥加密 | 椭圆曲线加密 | HASH |
---|---|---|---|---|
2009~2012 | 80 | 1248 | 160 | 160 |
2009~2020 | 96 | 1776 | 192 | 192 |
2009~2030 | 112 | 2432 | 224 | 224 |
2009~2040 | 128 | 3248 | 256 | 256 |
2009~ | 256 | 15424 | 512 | 512 |
表 5.6-3 CRYPTREC(Japan) CRYPTREC 加密算法列表
技术族 | 名称 | |
---|---|---|
公钥加密 | 签名 | DSA,ECDSA,RSA-PSS,RSASSA-PKCS1-V1_5 |
机密性 | RSA-OAEP | |
密钥共享 | DH,ECDH | |
共享密钥加密 | 64 位块加密 | 3-key Triple DES |
128 位块加密 | AES,Camellia | |
流式加密 | KCipher-2 | |
哈希函数 | SHA-256,SHA-384,SHA-512 | |
加密使用模式 | 密文模式 | CBC,CFB,CTR,OFB |
认证密文模式 | CCM,GCM | |
消息认证代码 | CMAC,HMAC | |
实体认证 | ISO/IEC 9798-2,ISO/IEC 9798-3 |
5.6.2.3 使用基于密码的加密时,不要在设备上存储密码(必需)
在基于密码的加密中,当根据用户输入的密码生成加密密钥时,请勿将密码存储在设备中。 基于密码的加密的优点是无需管理加密密钥;将密码存储在设备上消除了这一优势。 无需多说,在设备上存储密码会产生其他应用窃听的风险,因此出于安全原因,在设备上存储密码也是不可接受的。
5.6.2.4 从密码生成密钥时,使用盐(必需)
在基于密码的加密中,当根据用户输入的密码生成加密密钥时,请始终使用盐。 另外,如果你要在同一设备中为不同用户提供功能,请为每个用户使用不同的盐。 原因是,如果你仅使用简单的哈希函数生成加密密钥而不使用盐,则可以使用称为“彩虹表”的技术轻松恢复密码。使用了盐时,会使用相同的密码生成的密钥 将是不同的(不同的哈希值),防止使用彩虹表来搜索密钥。
示例:
public final byte[] encrypt(final byte[] plain, final char[] password) { byte[] encrypted = null; try { // *** POINT *** Explicitly specify the encryption mode and the padding. // *** POINT *** Use strong encryption methods (specifically, technologies that meet the relevant criteria), including algorithms, block cipher modes, and padding modes. Cipher cipher = Cipher.getInstance(TRANSFORMATION); // *** POINT *** When generating keys from passwords, use Salt. SecretKey secretKey = generateKey(password, mSalt);
5.6.2.5 从密码生成密钥时,指定适当的哈希迭代计数(必需)
在基于密码的加密中,当根据用户输入的密码生成加密密钥时,你需要选择在密钥生成过程(“拉伸”)中,散列过程的重复次数;指定足够大的数字来确保安全性非常重要。一般来说,1,000 或更大的迭代次数是足够的。如果你使用密钥来保护更有价值的资产,请指定 1,000,000 或更高的计数。由于散列函数的单个计算所需的处理时间很少,因此攻击者可能很容易进行爆破攻击。因此,通过使用拉伸方法(其中散列处理重复多次),我们可以有意确保该过程消耗大量时间,因此爆破攻击的成本更高。请注意,拉伸重复次数也会影响应用的处理速度,因此请谨慎选择合适的值。
示例:
private static final SecretKey generateKey(final char[] password, final byte[] salt) { SecretKey secretKey = null; PBEKeySpec keySpec = null; (Omit) // *** POINT *** When generating a key from password, use Salt. // *** POINT *** When generating a key from password, specify an appropriate hash iteration count. // *** POINT *** Use a key of length sufficient to guarantee the strength of encryption. keySpec = new PBEKeySpec(password, salt, KEY_GEN_ITERATION_COUNT, KEY_LENGTH_BITS);
5.6.2.6 采取措施来增加密码强度(推荐)
在基于密码的加密中,当基于用户输入的密码生成加密密钥时,生成的密钥的强度受用户密码强度的强烈影响,因此值得采取措施来加强从用户那里收到的密码。 例如,你可以要求密码长度至少为 8 个字符,并且包含多种类型的字符 - 可能至少包含一个字母,一个数字和一个符号。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
安卓应用安全指南 5.5.1 处理隐私数据 示例代码
5.5.1 处理隐私数据 示例代码 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 在准备应用的隐私政策时,你可以使用“协助创建应用隐私政策的工具” [29]。 这些工具以 HTML 格式和 XML 格式输出两个文件 - 应用隐私策略的摘要版本和详细版本。 这些文件的 HTML 和 XML 内容符合 MIC SPI 的建议,包括搜索标签等特性。 在下面的示例代码中,我们将演示此工具的用法,并使用由这个工具产生的 HTML 文件来展示程序隐私策略。 [29] http://www.kddilabs.jp/tech/public-tech/appgen.html 更具体地说,你可以使用以下流程图来确定使用哪个示例代码。 这里,“广泛同意”一词,指代广泛许可,由用户在应用的首次加载时,通过展示和查看程序隐私策略授予应用,用于应用将用户数据传输到服务器。 相反,短语“特定同意”指代在传输特定用户数据之前,立即获得的预先同意。 5.5.1.1 授予广泛同意和特定同意:包含应...
- 下一篇
安卓应用安全指南 5.6.3 密码学 高级话题
5.6.3 密码学 高级话题 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 5.6.3.1 选择加密方法 在上面的示例代码中,我们展示了三种加密方法的实现示例,每种加密方法用于加密解密以及数据伪造的检测。 你可以使用“图 5.6-1”,“图 5.6-2”,根据你的应用粗略选择使用哪种加密方法。 另一方面,加密方法的更加精细的选择,需要更详细地比较各种方法的特征。 在下面我们考虑一些这样的比较。 用于加密和解密的密码学方法的比较 公钥密码术具有很高的处理成本,因此不适合大规模数据处理。但是,因为用于加密和解密的密钥不同,所以仅仅在应用侧处理公钥(即,只执行加密),并且在不同(安全)位置执行解密的情况下,管理密钥相对容易。共享密钥加密是一种通用的加密方案,但限制很少,但在这种情况下,相同的密钥用于加密和解密,因此有必要将密钥安全地存储在应用中,从而使密钥管理变得困难。基于密码的密钥系统(基于密码的共享密钥系统)通过用户指定的密码生成密钥,避免了在设备中存储密钥相关的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用
- 设置Eclipse缩进为4个空格,增强代码规范
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7安装Docker,走上虚拟化容器引擎之路