Android APP开发实战:从规划到上线全程详解
上QQ阅读APP看书,第一时间看更新

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算法加密。