安卓应用安全指南 5.6.2 密码学 规则书

简介: 5.6.2 密码学 规则书 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0使用加密技术时,遵循以下规则:5.6.2.1 指定加密算法时,请显式指定加密模式和填充(必需)在使用加密技术和数据验证等密码学技术时,加密模式和填充必须显式指定。

5.6.2 密码学 规则书

原书:Android Application Secure Design/Secure Coding Guidebook

译者:飞龙

协议:CC BY-NC-SA 4.0

使用加密技术时,遵循以下规则:

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 个字符,并且包含多种类型的字符 - 可能至少包含一个字母,一个数字和一个符号。

相关文章
|
3月前
构建安全可靠的系统:第十六章到第二十章
构建安全可靠的系统:第十六章到第二十章
131 0
|
监控 安全 芯片
看见“信任”,可信计算史上最全解析
等保2.0将可信提升到一个新的强度。在等保一到四级都有可信的要求,主要在三个领域:计算环境可信、网络可信、接入可信。
32128 1
看见“信任”,可信计算史上最全解析
|
移动开发 安全 区块链
顶象无感验证为十八数藏“加固城墙”
2022 的热词榜上,数字藏品与NFT 绝对有一席之地。
137 0
顶象无感验证为十八数藏“加固城墙”
|
安全 Android开发 存储
安卓应用安全指南 5.5.2 处理隐私数据 规则书
5.5.2 处理隐私数据 规则书 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 处理隐私策略时,遵循以下规则: 5.5.2.1 将用户数据的传输限制为最低需求(必需) 将使用数据传输到外部服务器或其他目标时,将传输限制在提供服务的最低需求。
1040 0
|
存储 安全 算法
安卓应用安全指南 5.6.3 密码学 高级话题
5.6.3 密码学 高级话题 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 5.6.3.1 选择加密方法 在上面的示例代码中,我们展示了三种加密方法的实现示例,每种加密方法用于加密解密以及数据伪造的检测。
1485 0
|
安全 算法 Java
安卓应用安全指南 5.6.1 密码学 示例代码
5.6.1 密码学 示例代码 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 针对特定用途和条件开发了各种加密方法,包括加密和解密数据(来确保机密性)和检测数据伪造(来确保完整性)等用例。
1278 0
|
存储 安全 Android开发
安卓应用安全指南 5.5.3 处理隐私数据 高级话题
5.5.3 处理隐私数据 高级话题 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 5.3.3.1 隐私政策的背景和上下文 对于智能手机应用获取用户数据,并向外传输该数据的情况,需要准备并显示应用隐私策略,来通知用户一些详细信息,例如收集的数据类型,以及数据被处理的方式。
1221 0
|
安全 算法 Java
安卓应用安全指南 5.7 使用指纹认证功能
5.7 使用指纹认证功能 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 目前正在研究和开发的各种用于生物认证的方法中,使用面部信息和声音特征的方法尤其突出。
1375 0
|
安全 Android开发 数据格式
安卓应用安全指南 5.5.1 处理隐私数据 示例代码
5.5.1 处理隐私数据 示例代码 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 在准备应用的隐私政策时,你可以使用“协助创建应用隐私政策的工具” [29]。
1085 0
|
存储 安全 Android开发
安卓应用安全指南 六、困难问题
六、困难问题 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 在 Android 中,由于 Android 操作系统规范或 Android 操作系统提供的功能,难以确保应用实现的安全性。
1242 0