![Android APP开发实战:从规划到上线全程详解](https://wfqqreader-1252317822.image.myqcloud.com/cover/677/22655677/b_22655677.jpg)
8.3 MD5简介
除了上述两种加密方法外,还有一种使用最广泛的加密方法,即MD5加密。
MD5(Message-Digest Algorithm 5)即信息-摘要算法5,是计算机安全领域广泛使用的一种散列函数,用于提供数据的完整性保护,它是把一个任意长度的字符串变换成一个固定长度的字符串。
MD5算法具有以下特点。
· 根据最终输出的值,无法得到原始的明文,即过程是不可逆的。
· 任意长度的数据,算出的MD5值长度都是固定的。
Java提供了MD5加密的库,如下是对数据进行MD5加密处理的代码。
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; private String makeMD5Hash(String key) { String cacheKey; try { final MessageDigest mDigest = MessageDigest.getInstance("MD5"); mDigest.reset(); mDigest.update(key.getBytes()); cacheKey = bytesToHexString(mDigest.digest()); } catch (NoSuchAlgorithmException e) { cacheKey = String.valueOf(key.hashCode()); } return cacheKey; } private String bytesToHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte value : bytes) { String hex = Integer.toHexString(0xFF & value); if (hex.length() == 1) { sb.append( '0 '); } sb.append(hex); } return sb.toString(); }
如原始数据字符串是“123abc456”,利用上述代码加密后生成的MD5数值字符串为“f9fc7942e4c44f26 92bc186fa7486dd4”。
MD5加密主要用于需要对原始数据加密,但数据的使用方又不需要知道原始数据的场景,而且还可用于数据完整性校验。
(1)对登录密码进行加密。
如用户使用APP注册的时候,APP把用户输入的密码进行MD5 Hash运算,然后发送给服务器保存。用户使用APP登录的时候,服务器把从APP接收到的MD5值和保存的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,服务器在并不知道用户密码的明码的情况下,就可以确定用户登录的合法性。这就可以避免用户的密码被具有系统管理员权限的人员知道。
(2)对文件名进行加密。
在使用APP的时候,常需要在本地缓存一些文件,可以使用MD5对这些文件名进行加密,防止通过文件名了解文件的相关信息。
(3)数据完整性的校验。
常常在某些软件下载站点的软件信息中看到有MD5值,它的作用就在于下载该软件后对下载的文件做一次MD5校验,以确保获得的文件数据的完整性和正确性。
具体来说,文件的MD5值就像是这个文件的“数字指纹”。每个文件的MD5值是不同的,如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”就会发生变化。比如下载服务器针对一个文件预先提供一个MD5值,用户下载完该文件后,用算法重新计算下载文件的MD5值,通过比较这两个值是否相同,就能判断下载的文件数据是否完整,以及下载的文件数据是否被篡改了。如APP升级版本时,需要从服务器下载新版本,此时就可用MD5进行完整性的校验。
为了增加解密的难度,有时会采用加盐的方式,就是在明文数据中加入一个随机字符串,如当前操作的时间字符串,然后再用MD5算法加密。