这篇文章是“Android数据安全”系列的一部分:
- Encryption
- Encryption in Android (Part 1)
- Encryption in Android (Part 2)
- Encrypting Large Data
- Initialization Vector
- Key Invalidation
- Fingerprint
- Confirm Credentials
那些关于”android数据安全“工作室的话题。具有完整代码片段的示例应用程序可在GitHub上获得。
目录
- 加密
- 算法类型
- 模式和填充
- 密钥类型
- 下一步是什么
- 安全提示
加密
这是实现数据安全的最有效方法。在本系列文章中,我们将主要关注它。
要读取加密数据,必须访问一个允许您解密它的密钥或密码。未加密的数据被称为普通数据(明文),加密的数据称为密码数据(密码文本)。
总体加密工作如下:
你有明文的数据,这可能是一些敏感信息(如个人生活信息、身体或心理健康细节、犯罪或民事犯罪、私人照片、私人用户文件等)。财务信息(如账户、交易、报告、信用卡信息等),当然还有凭证(用户名、密码、触摸PIN码、指纹数据和所有其他可以提供对上述数据的访问的东西)。
然后,根据一些算法,您将创建一个特殊的密钥,并使用它来创建密码数据。
例如,一个简单的算法–用一些方式来改变单词中的每个符号。一个秘钥-某物等于字母表中的下一个符号:
1 2 |
算法: 使用一些规则来改变一个单词中的每个符号。 秘钥: 字母表的下一个字母 |
1 2 |
明文 (输入): "Hello World" 加密后数据 (输出): "ifmmp xpsme" |
1 2 3 4 5 6 7 8 |
Symbol Mask: h -> i e -> f l -> m o -> p w -> x r -> s d -> e |
当然,所有的工作都是可逆的,如果你有一个密码数据,你知道算法并有一个密钥,你将轻松地得到原始的原始数据。
算法类型
上面,我们看到了加密的一个非常基本的例子。现在算法更复杂,在对称和非对称上分离(也有散列函数,不需要密钥,本文不对该算法分析)。
对称——是最古老和最著名的技术。加密密钥和解密密钥是相同的。它通常被归类为流密码或块密码。
最常用的对称AES——高级加密标准(AES)是美国政府和众多组织信任的标准算法。
非对称性——现代密码学的一个分支。也称为公钥密码学,其中算法使用一对密钥(公钥和私钥),这一对秘钥在算法的不同步骤中有不同的使用方式。
最常用的非对称算法是RSA-公钥加密算法,并且是互联网发送加密数据的标准。
流密码是一种对称加密算法,用一个密钥一次处理一个比特或一个字节的数据,从而产生一个随机化的密码数据或明文数据。
分组密码算法——分组密码也称块密码,当加密一条长消息(明文)时,首先,将明文编码表示为二进制序列;然后将其分为若干个固定长度的组(最后一组长度不够时还得进行填充,下面会介绍填充的方法),最后,再对每个分组依次进行加密操作。分组长短决定着密码的强度。从算法的安全性考虑,分组长度不能太短,应该保证加密算法能够应对密码分析。从实用性考虑,分组长度又不能太长,要便于操作和运算。近年来随着计算机计算能力不断的提升,分组长度为64位的分组密码的安全性越来越不能满足实际需要,为了提高加密的安全性,很多分组密码开始选择128位作为算法的分组长度。
模式与填充
分组密码具有不同的模式和增加其保护等级的填充。
模式—一种操作模式描述如何重复应用密码的单块操作,以安全地变换大于一个块的数据量。
填充— 分组密码在固定大小的单位(称为块大小)上工作,但消息以不同的长度出现。因此,一些模式(即ECB和CBC)要求在加密前填充最终块。
最常用的模式有 :
ECB — 电子密码本, 最简单的加密模式。信息是分为块的,每一块分别加密。
风险
- 相同明文加密出来的密文是相同的。因为参与加密的只有明文和密钥,所以只能得出相同的密文。这个可以给攻击者通过推测猜测出明文的内容。
- 存在被篡改的风险,可以实现无需破解密文,即可以操纵明文。
这个风险的根本原因是因为,在加密的过程中,每个分组是互相独立的。
例子:
假设有明文被分成三个分组,恰好代表三个意思:
分组1:付款人
分组2:收款人
分组3:金额
怎样通过密文操纵明文呢?
我们可以截获密文,然后将密文的分组2和分组1调整一下先后顺序,先发送分组2,再发送分组1。这样付款人和收款人就互相调换了位置。
- 这种模式很容易被黑客使用“重放攻击”的方式攻击。“重放攻击”是一种攻击类型,这种攻击会不断恶意或欺诈性地重复一个有效的数据传输,重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。从这个解释上理解,加密可以有效防止会话劫持,但是却防止不了重放攻击。重放攻击任何网络通讯过程中都可能发生。重放攻击是计算机世界黑客常用的攻击方式之一,它的书面定义对不了解密码学的人来说比较抽象。
CBC — 密码块链, 该模式下每个明文块会先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量IV。
CBC是最为常用的工作模式。它的主要缺点在于加密过程是串行的,无法被并行化,而且消息必须被填充到块大小的整数倍。在加密时,明文中的微小改变会导致其后的全部密文块发生改变,而在解密时,从两个邻接的密文块中即可得到一个明文块。因此,解密过程可以被并行化,而解密时,密文中一位的改变只会导致其对应的明文块完全改变和下一个明文块中对应位发生改变,不会影响到其它明文的内容。
秘钥类型
有三种秘钥类型: 秘密秘钥, 私钥和公钥
秘密秘钥— 在传统对称加密中用于加密和解密消息的单个秘密密钥。
私钥 — 非对称密码学中用于解密的一对密钥的秘密组成部分。
公钥— 非对称密码学中用于加密的一对秘钥的公开组成部分。
公共密钥和私有密钥共同构成公钥私钥对。
下一篇文章内容
在“Android数据安全”系列的下一篇“Android中的加密”文章中我们会学习:
Android基于Java加密体系结构(JCA)上,它提供了用于数字签名、证书、加密、密钥生成和管理的API…
安全提示
通常,我们建议尽量减少用户证书的使用频率。 — 想要使钓鱼攻击更加明显,成功的可能性小。可以使用授权令牌并刷新它的方式来替代。
在可能的情况下,用户名和密码不应存储在设备上。相反,使用用户提供的用户名和密码执行初始身份验证,然后使用过期时间短的、特定于服务的授权令牌。
“尽量避免尽可能多地存储私有用户数据。”
Howdy! I know this is kinda off topic but I’d figured
I’d ask. Would you be interested in trading links
or maybe guest writing a blog post or vice-versa? My website addresses a
lot of the same subjects as yours and I think
we could greatly benefit from each other.
If you might be interested feel free to send
me an email. I look forward to hearing from you!
Great blog by the way!
Aw, this was an extremely nice post. Taking the time and actual
effort to make a superb article… but what can I say… I hesitate a
whole lot and never seem to get anything done.