Android常用的加密算法

一、MD5

MD5可以说是最基本最常用的加密算法了。(还依稀记得在校招面试的时候被问到过...)

MD5信息摘要算法(MD5 Message-Digest Algorithm)。算法能将任意大小、格式的文字或文件进行加密从而产生 128 bit(16 字节)的散列值。不论输入的的串是多长(1-无穷),生成的MD5值都是128bit。

2009年,中科院的谢涛和冯登国仅用了的碰撞算法复杂度,破解了MD5的碰撞抵抗,该攻击在普通计算机上运行只需要数秒钟。

想想也知道不论多长的串,都可以生成128bit的值,128bit可表示的数是有限的,而串的个数是无限的,总会有碰撞。不过这并不影响MD5的运用。MD5的常见应用场景如下:

1. 用于密码管理

当数据库中存储密码明文时,管理人员就可以很容易地看到明文,这些信息泄露,密码很容易被破译。MD5就在这里起到作用,在数据库中保存密码的MD5序列,只有相同的密码才能生成指定的MD5序列,MD5序列长度都是一样的。使用时,将密码的MD5值与数据库中的密文比较,如果相同就认为密码正确。增加密码的安全性。

2. 电子签名

这也是最常见的应用场景,具体操作是比较两个文件的MD5值是否相同,来判断是否是同一个文件。通常用于文件传输后,进行比对,文件的MD5值相同就认为文件下载正常。也可以判断出文件在传输过程中是否被修改。

3. 垃圾邮件筛选

原理也很简单,将邮件的内容生成MD5值,如果相同的MD5值很多,就判断邮件是垃圾邮件。

二、BASE64

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。

简单地说,BASE64可以把任意的二进制数据,转换为64个可打印字符的排列组合。

BASE64说它是加密,任何人都可以对其进行解密,其一般不用来加密数据,目的只是为了保护原内容不被直观地看到。

三、异或加密

原理很简单,例如data是0110,key是1010,加密过程:data  key = 1100(位运算,相同为0,不同为1)。解密过程是使用加密的结果再与key进行异或,就会得到原始数据data。异或key的长度可以随意设置,使用的时候若data长度大于key长度,循环使用key即可(见下方代码)。

异或加密可以加密数据,但需要保存好key,秘钥管理较为麻烦。

而且如果让异或加密算法加密全为0的数组,就会暴露秘钥(异或的性质,与全0数据异或后得其本身)。

这里记录一下项目中使用异或加密出现的一个问题:含有中文的字符串,经过异或加密,再解密后会出现乱码。

贴一小段异或加密的代码

    public static byte[] xorEncode(byte[] data) {
        String key = "encryptKey";
        byte[] keyBytes = key.getBytes();
        byte[] encryptBytes = new byte[data.length];
        for (int i = 0; i < data.length; i++) {
            encryptBytes[i] = (byte) (data[i] ^ keyBytes[i % keyBytes.length]);
        }
        return encryptBytes;
    }

原因是中文字符转换为字节数据(byte)后,再经过异或,会变成无效的UTF-8编码,然后将异或后的字节数据转String获取到错误的字符串,之后再解密该错误的字符串,不能正确还原成原先的字符串。(引用自参考文档2)

解决该问题的方法有两个:

1. 使用char[]替代byte[],因为char是由两个byte组成的,可以表示一个汉字。

2. 字符串含有汉字时,先经过BASE64将汉字转换为字符,再异或加密。解密时同样先异或,再BASE64解析汉字。

四、DES和AES加密

DES和AES加密都属于对称加密算法,也就是他们加密和解密使用的秘钥是相同的。

1. DES加密

DES全称为Data Encryption Standard,即数据加密标准。是最早的加密算法,使用的时候将数据分为64位一组,最后一组不足64位可通过固定的方式补足,然后把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。

DES加密由于秘钥较短,在计算机计算能力提升以后,可以在一天左右的时间内暴力破解DES加密。为了防止这种情况的出现,出现了3DES加密技术。

2. 3DES加密

将DES加密算法以不同的秘钥加密3次,就是3DES加密。3个秘钥不同,则极大地提升了破解的难度。代价是运行时间和效率。

3. AES加密

AES全称Advanced Encryption Standard,是密码学中的高级加密标准,又称Rijndael加密法,Rijndael是由AES加密算法的两个发明人的名字合成的。

AES由DES发展而来,同样采用块加密的加密方式,但增大了块的大小至128bit。AES的的Key支持三种长度,分别是AES128,AES192,AES256。(这就是吃了DES64位秘钥被暴力破解的苦头,增加了秘钥长度,同时直接支持扩展秘钥)

AES相对于3DES提高了运行效率,同样难破解。

五、UUID

UUID 是 Universally Unique Identifier的缩写,名称是通用唯一识别码。是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。

UUID是一个128比特的数值,在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。

UUID具有多个版本:

1. 基于时间的UUID。通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。

2. DCE安全的UUID。DCE(Distributed Computing Environment)安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。

3. 基于名字的UUID(MD5)

基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。

4. 随机UUID

根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但随机的东西就像是买彩票:你指望它发财是不可能的。

5. 基于名字的UUID(SHA1)

和基于名字的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。

一个UUID的栗子:7cbcf75c-16cc-4536-bfb3-e5d8b210e888(这个UUID是由随机数得来)

当系统中需要机器的唯一标识时,可以使用UUID。

为什么讲UUID在加密部分提到呢,我觉得UUID是加密算法很好的素材和补充,加密解密的根本目的也是为了识别到指定的信息。

参考文档:

https://blog.csdn.net/qq_18870023/article/details/51969233

https://www.jianshu.com/p/cee17b67bb87

https://blog.csdn.net/qq_27570955/article/details/52442092

https://www.sohu.com/a/200488301_478315

发布了4 篇原创文章 · 获赞 0 · 访问量 166

猜你喜欢

转载自blog.csdn.net/bluerheaven/article/details/103982808