MD5
从PHP到Python,再到做Java Web,每次使用的加密解密方法都不尽相同,TP框架依然使用的是MD5,Laravel使用的是自带的辅助函数encrypt加密,decript揭秘。Python django使用的也是自带cript,一般也会引入make_password和check_password模块,Java都是自己写接口,很累,包括MD5,BASE64,DES,RSA等。
何为MD5?
MD5算法将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。这就相当于这个文件的指纹,如果有任何人修改了文件内容,或下载文件由于网络问题不完整,则生成的md5值也会发生变化。
MD5算法本质是一个哈希算法,因此MD5值就是一个哈希值。
- 对于同样的文件,计算出的MD5值永远是一样的。MD5算法中没有任何随机数或不确定因素。
- MD5算法是公开的。因而我们可以找到很多个MD5生成器,但背后的算法是一样的。
- 我们可以认为世界上的文件是无限的,而得到的MD5值永远是一个128位二进制数。因此是一个无穷序列到一个有限序列的映射。进而可以得知,MD5算法是不可逆的,也就是说,我们不能用一个MD5值来推算出源文件的内容。
- 从无穷序列到有限序列的映射这点又可以推断出,MD5算法可能产生冲突(这也是所有哈希函数都会遇到的问题)。即两个不同的文件,可能会产生一样的MD5值。
编写MD5加密实例
String.getBytes()
Java中,getBytes()方法得到一个操作系统默认的编码格式字节数组。
String.getBytes(String decode)
该方法会根据指定的decode编码返回某字节在该编码下的byte数组
- byte[] b_gbk = “中”.getBytes(“GBK”);
- byte[] b_utf8 = “中”.getBytes(“UTF-8”);
- byte[] b_iso88591 = “中”.getBytes(“ISO8859-1”);
将分别返回“中”这个汉字在GBK、UTF-8和ISO8859-1编码下的byte数组表示,此时b_gbk的长度为2,b_utf8的长度为3,b_iso88591的长度为1。
具体步骤
创建md5对象
MessageDigest md5 = MessageDigest.getInstance("md5");
进行加密操作
byte[] cipherData = md5.digest(plainText.getBytes());
简单示例
public class MD5Util {
private static String MD5Encode(String origin, String charsetName) {
String resultString = null;
try {
resultString = new String(origin);
MessageDigest md5 = MessageDigest.getInstance("md5");
if(charsetName==null || "".equals(charsetName))
resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
else
resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
} catch (Exception exception) {
}
return resultString.toUpperCase();
}
private static String byteArrayToHexString(byte b[]) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++)
resultSb.append(byteToHexString(b[i]));
return resultSb.toString();
}
//在原始字符串前加上一串字符目的是增强安全,防止解密后获得原始密码
public static String MD5EncodeUtf8(String origin) {
origin = origin + PropertiesUtil.getProperty("password.salt", "");
return MD5Encode(origin, "utf-8");
}
}
上述示例中的MD5EncodeUtf8函数使用了Properties属性加载类,具体实现方法下一篇文章叙述。