Java MD5加密

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属性加载类,具体实现方法下一篇文章叙述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值