Android应用安全开发之浅谈加密算法的坑

上传人:ji****72 文档编号:37523290 上传时间:2018-04-17 格式:DOCX 页数:10 大小:749.60KB
返回 下载 相关 举报
Android应用安全开发之浅谈加密算法的坑_第1页
第1页 / 共10页
Android应用安全开发之浅谈加密算法的坑_第2页
第2页 / 共10页
Android应用安全开发之浅谈加密算法的坑_第3页
第3页 / 共10页
Android应用安全开发之浅谈加密算法的坑_第4页
第4页 / 共10页
Android应用安全开发之浅谈加密算法的坑_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《Android应用安全开发之浅谈加密算法的坑》由会员分享,可在线阅读,更多相关《Android应用安全开发之浅谈加密算法的坑(10页珍藏版)》请在金锄头文库上搜索。

1、AndroidAndroid 应用安全开发之浅谈加密算法应用安全开发之浅谈加密算法 的坑的坑作者:阿里移动安全作者:阿里移动安全伊樵,伊樵,舟海舟海阿里聚安全,一站式解决应用开发安全问题阿里聚安全,一站式解决应用开发安全问题Android 开发中,难免会遇到需要加解密一些数据内容存到本地文件、或者通过网 络传输到其他服务器和设备的问题,但并不是使用了加密就绝对安全了,如果加密 函数使用不正确,加密数据很容易受到逆向破解攻击。还有很多开发者没有意识到 的加密算法的问题。1 1、需要了解的基本概念、需要了解的基本概念密码学的三大作用:加密( Encryption)、认证(Authenticatio

2、n),鉴定 (Identification) 加密:防止坏人获取你的数据。 认证:防止坏人修改了你的数据而你却并没有发现。 鉴权:防止坏人假冒你的身份。明文、密文、密钥、对称加密算法、非对称加密算法,这些基本概念和加密算法原 理就不展开叙述了。2 2、AndroidAndroid SDKSDK 提供的提供的 APIAPI2.1 Android 加密相关加密相关 API 结构结构Android SDK 使用的 API 和 JAVA 提供的基本相似,由 Java Cryptography Architecture (JCA,java 加密体系结构) ,Java Cryptography Exten

3、sion (JCE,Java 加密扩展包) ,Java Secure Sockets Extension(JSSE,Java 安全套 接字扩展包),Java Authentication and Authentication Service(JAAS,Java 鉴别 与安全服务)组成。JCA 提供基本的加密框架,如证书、数字签名、消息摘要和密钥对产生器,对应 的 Android API 中的以下几个包:JCE 扩展了 JCA,提供了各种加密算法、摘要算法、密钥管理等功能,对应的 Android API 中的以下几个包:JSSE 提供了 SSL(基于安全套接层)的加密功能,使用 HTTPS 加密

4、传输使用, 对应的 Android API 主要是 .ssl 包中。JAAS 提供了在 Java 平台上进行用户身份鉴别的功能。对应的 Android API 主要 在以下几个包:它们其实只是一组接口,实际的算法是可由不同的 Provider 提供,Android API 默 认的 Provider 主要是是 Bouncy Castle 和 OpenSSL。 此外 Android API 还提供了 android.security 和 android.security.keystore(API 23 新增)来管理 keychain 和 keystore。2.2 Base64 编码算法编码算法B

5、ase64 编码算法是一种用 64 个字符 (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567 89+/)来表示任意二进制数据的方法。在计算机网络发展的早期,由于“历史原因”, 电子邮件不支持非 ASCII 码字符,如果要传送的电子邮件带有非 ASCII 码字符 (诸如中文)或者图片,用户收到的电子邮件将会是一堆乱码,因此发明了 Base64 编码算法。至于为何会乱码?请大家自行 Google。在加解密算法中,原 始的数据和加密后的数据一般也是二进制数据,为了不传输出错,方便保存或者调 试代码,一般需要对加密后的数据进行

6、base64 编码。 Android 提供了 Base64 编码的工具类 android.util.Base64,可以直接使用,不用 自己去实现 base64 编码的算法了。 如:开发者建议:开发者建议: base64 只是一种编码方式,并不是一种加密算法,不要使用 base64 来加密数据。2.3 随机数生成器随机数生成器在 Android 加密算法中需要随机数时要使用 SecureRandom 来获取随机数。 如:注意不要给 SecureRandom 设置种子。调用 seeded constructor 或者 setSeed(byte)是不安全的。SecureRandom()默认使用的是

7、dev/urandom 作为种 子产生器,这个种子是不可预测的。 开发者建议:开发者建议: 1、不要使用 Random 类来获取随机数。 2、在使用 SecureRandom 时候,不要设置种子。使用以下函数设置种子都是有风 险的:2.4 Hash 算法算法Hash 算法是指任意长度的字符串输入,此算法能给出固定 n 比特的字符串输出, 输出的字符串一般称为 Hash 值。 具有以下两个特点:抗碰撞性:寻找两个不同输入得到相同的输出值在计算上是不可行的,需 要大约 的时间去寻找到具有相同输出的两个输入字符串。不可逆:不可从结果推导出它的初始状态。抗碰撞性使 Hash 算法对原始输入的任意一点更

8、改,都会导致产生不同的 Hash 值, 因此 Hash 算法可以用来检验数据的完整性。我们经常见到在一些网站下载某个文 件时,网站还提供了此文件的 hash 值,以供我们下载文件后检验文件是否被篡改。不可逆的特性使 Hash 算法成为一种单向密码体制,只能加密不能解密,可以用来 加密用户的登录密码等凭证。 开发者建议:开发者建议: 1、建议使用 SHA-256、SHA-3 算法。 如使用 SHA-256 算法对 message 字符串做哈希:2、不建议使用 MD2、MD4、MD5、SHA-1、RIPEMD 算法来加密用户密码等敏 感信息。这一类算法已经有很多破解办法,例如 md5 算法,网上有

9、很多查询的字 典库,给出 md5 值,可以查到加密前的数据。3、不要使用哈希函数做为对称加密算法的签名。 4、注意:当多个字符串串接后再做当多个字符串串接后再做 hash,要非常当心,要非常当心。 如:字符串 S,字符串 T,串接做 hash,记为 H (S|T)。但是有可能发生以下情 况。如“builtin|securely” 和 “built|insecurely”的 hash 值是完全一样的。 如何修改从而避免上述问题产生? 改为 H(length(S) | S | T)或者 H(H(S)|H(T)或者 H(H(S)|T)。实际开发过程中经常会对 url 的各个参数,做词典排序,然后取参

10、数名和值串接后 加上某个 SECRET 字符串,计算出 hash 值,作为此 URL 的签名, 如 foo=1, bar=2, baz=3 排序后为 bar=2, baz=3, foo=1,做 hash 的字符串为: SECRETbar2baz3foo1,在参数和值之间没有分隔符,则”foo=bar”和”foob=ar”的 hash 值是一样的,”foo=bar&fooble=baz”和”foo=barfooblebaz”一样,这样通过精 心构造的恶意参数就有可能与正常参数的 hash 值一样,从而骗过服务器的签名校 验。2.5 消息认证算法消息认证算法要确保加密的消息不是别人伪造的,需要提供

11、一个消息认证码(MAC,Message authentication code)。 消息认证码是带密钥的 hash 函数,基于密钥和 hash 函数。密钥双方事先约定,不能让第三方知道。消息发送者使用 MAC 算法计算出消息的 MAC 值,追加到消息后面一起发送给接 收者。 接收者收到消息后,用相同的 MAC 算法计算接收到消息 MAC 值,并与接收到的 MAC 值对比是否一样。 开发者建议:开发者建议: 建议使用 HMAC-SHA256 算法,避免使用 CBC-MAC。 HMAC-SHA256 例子如下:2.6 对称加密算法对称加密算法在对称加密算法中,数据发信方将明文(原始数据)和加密密钥

12、一起经过特殊加密 算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原 文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢 复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个 密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。 该算法的缺点是,如果一旦密钥泄漏,那么加密的内容将都不可信了。 开发者建议:开发者建议: 1、建议使用 AES 算法。 2、DES 默认的是 56 位的加密密钥,已经不安全,不建议使用。 3、注意加密模式不要使用 ECB 模式。ECB 模式不安全,说明问题的经典的三张 图片,如 明文是:用 EC

13、B 加密模式后:用 CBC 加密模式后:想更深入的了解关于对 CBC 加密模式的攻击,可参看:SSL/TLS 协议安全系列: CBC 模式的弱安全性介绍(一)http:/drops.wooyun.org/tips/66194、Android 提供的 AES 加密算法 API 默认使用的是 ECB 模式,所以要显式指定 加密算法为:CBC 或 CFB 模式,可带上 PKCS5Padding 填充。AES 密钥长度最 少是 128 位,推荐使用 256 位。2.7 非对称加密非对称加密非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。 公开密钥与私有密钥

14、是一对,如果用公开密钥对数据进行加密,只有用对应的私有 密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能 解密(这个过程可以做数字签名)。 非对称加密主要使用的是 RSA 算法。 开发者建议:开发者建议: 1、注意密钥长度不要低于 512 位,建议使用 2048 位的密钥长度。 使用 RSA 进行数字签名的算法,如:2、使用 RSA 算法做加密,RSA 加密算法应使用 Cipher.getInstance(RSA/ECB/OAEPWithSHA256AndMGF1Padding),否则会存 在重放攻击的风险。 如:2.8 加密算法加密算法 PBEPBE 是一种基于口令的

15、加密算法,其特点是使用口令代替了密钥,而口令由用户 自己掌管,采用随机数杂凑多重加密等方法保证数据的安全性。 开发者建议:开发者建议: 使用基于口令的加密算法 PBE 时,生成密钥时要加盐,盐的取值最好来自 SecureRandom,并指定迭代次数。 如:(以上所有示例算法仅供参考)3 3、总结、总结几条原则: 1、不要自己设计加密算法和协议,使用业界标准的算法。 2、对称加密算法不要使用 ECB 模式,不建议使用 DES 算法。 3、要选择合适长度的密钥。 4、要确保随机数生成器的种子具有足够的信息熵。 5、不要使用没有消息认证的加密算法加密消息,无法防重放。 6、当多个字符串拼接后做 ha

16、sh,要非常当心。 7、当给算法加 yan 盐取值时不要太短,不要重复。 8、使用初始化向量时 IV 时,IV 为常量的 CBC,CFB,GCM 等和 ECB 一样可以 重放,即采用上一个消息的最后一块密文作为下一个消息的 IV,是不安全的。 9、密钥应遵循的原则 (1)密钥不能为常量,应随机,定期更换,如果加密数据时使用的密钥为常量, 则相同明文加密会得到相同的密文,很难防止字典攻击。 (2)开发同学要防范密钥硬编码的毛病。 而在实际开发中,密钥如何保存始终是绕不过的坎?如果硬编码在代码中容易被逆 向,如果放在设备的某个文件,也会被有经验的破解者逆向找到,在这里推荐阿里 聚安全的安全组件服务,其中的安全加密功能提供了开发者密钥的安全管理与加密 算法实现,保证密钥的安全性,实现安全的加解密操作。参考: 1、Java 加密与解密的艺术 2、Android Application Secure Design/Secure Coding Guidebook 3、http:/security.stackexchange.c

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号