天天看点

java常见加密方式介绍

本篇内容简要介绍base64、md5、sha、hmac几种加密算法。 

    base64编码算法不算是真正的加密算法。 

    md5、sha、hmac这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。 

base64 

按照rfc2045的定义,base64被定义为:base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(the base64 content-transfer-encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.) 

常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过base64加密的。 

通过java代码实现如下:

java代码  

/** 

 * base64解密 

 *  

 * @param key 

 * @return 

 * @throws exception 

 */  

public static byte[] decryptbase64(string key) throws exception {  

    return (new base64decoder()).decodebuffer(key);  

}  

 * base64加密 

public static string encryptbase64(byte[] key) throws exception {  

    return (new base64encoder()).encodebuffer(key);  

主要就是base64encoder、base64decoder两个类,我们只需要知道使用对应的方法即可。另,base加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。 

md5 

md5 -- message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过md5后都能生成唯一的md5值。好比现在的iso校验,都是md5校验。怎么用?当然是把iso经过md5后产生md5的值。一般下载linux-iso的朋友都见过下载链接旁边放着md5的串。就是用来验证文件是否一致的。 

java代码 

 * md5加密 

 * @param data 

public static byte[] encryptmd5(byte[] data) throws exception {  

    messagedigest md5 = messagedigest.getinstance(key_md5);  

    md5.update(data);  

    return md5.digest();  

通常我们不直接使用上述md5加密。通常将md5产生的字节数组交给base64再加密一把,得到相应的字符串。 

sha 

sha(secure hash algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,sha与md5通过碰撞法都被破解了, 但是sha仍然是公认的安全加密算法,较之md5更为安全。

    /** 

     * sha加密 

     *  

     * @param data 

     * @return 

     * @throws exception 

     */  

    public static byte[] encryptsha(byte[] data) throws exception {  

        messagedigest sha = messagedigest.getinstance(key_sha);  

        sha.update(data);  

        return sha.digest();  

    }  

hmac 

hmac(hash message authentication code,散列消息鉴别码,基于密钥的hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即mac,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。 

 * 初始化hmac密钥 

public static string initmackey() throws exception {  

    keygenerator keygenerator = keygenerator.getinstance(key_mac);  

    secretkey secretkey = keygenerator.generatekey();  

    return encryptbase64(secretkey.getencoded());  

 * hmac加密 

public static byte[] encrypthmac(byte[] data, string key) throws exception {  

    secretkey secretkey = new secretkeyspec(decryptbase64(key), key_mac);  

    mac mac = mac.getinstance(secretkey.getalgorithm());  

    mac.init(secretkey);  

    return mac.dofinal(data);  

给出一个完整类,如下:

java常见加密方式介绍

java代码  

java常见加密方式介绍

import java.security.messagedigest;  

import javax.crypto.keygenerator;  

import javax.crypto.mac;  

import javax.crypto.secretkey;  

import sun.misc.base64decoder;  

import sun.misc.base64encoder;  

 * 基础加密组件 

 * @author 

 * @version 1.0 

 * @since 1.0 

public abstract class coder {  

    public static final string key_sha = "sha";  

    public static final string key_md5 = "md5";  

     * mac算法可选以下多种算法 

     * <pre> 

     * hmacmd5  

     * hmacsha1  

     * hmacsha256  

     * hmacsha384  

     * hmacsha512 

     * </pre> 

    public static final string key_mac = "hmacmd5";  

     * base64解密 

     * @param key 

    public static byte[] decryptbase64(string key) throws exception {  

        return (new base64decoder()).decodebuffer(key);  

     * base64加密 

    public static string encryptbase64(byte[] key) throws exception {  

        return (new base64encoder()).encodebuffer(key);  

     * md5加密 

    public static byte[] encryptmd5(byte[] data) throws exception {  

        messagedigest md5 = messagedigest.getinstance(key_md5);  

        md5.update(data);  

        return md5.digest();  

     * 初始化hmac密钥 

    public static string initmackey() throws exception {  

        keygenerator keygenerator = keygenerator.getinstance(key_mac);  

        secretkey secretkey = keygenerator.generatekey();  

        return encryptbase64(secretkey.getencoded());  

     * hmac加密 

    public static byte[] encrypthmac(byte[] data, string key) throws exception {  

        secretkey secretkey = new secretkeyspec(decryptbase64(key), key_mac);  

        mac mac = mac.getinstance(secretkey.getalgorithm());  

        mac.init(secretkey);  

        return mac.dofinal(data);  

再给出一个测试类:

import static org.junit.assert.*;  

import org.junit.test;  

public class codertest {  

    @test  

    public void test() throws exception {  

        string inputstr = "简单加密";  

        system.err.println("原文:\n" + inputstr);  

        byte[] inputdata = inputstr.getbytes();  

        string code = coder.encryptbase64(inputdata);  

        system.err.println("base64加密后:\n" + code);  

        byte[] output = coder.decryptbase64(code);  

        string outputstr = new string(output);  

        system.err.println("base64解密后:\n" + outputstr);  

        // 验证base64加密解密一致性  

        assertequals(inputstr, outputstr);  

        // 验证md5对于同一内容加密是否一致  

        assertarrayequals(coder.encryptmd5(inputdata), coder  

                .encryptmd5(inputdata));  

        // 验证sha对于同一内容加密是否一致  

        assertarrayequals(coder.encryptsha(inputdata), coder  

                .encryptsha(inputdata));  

        string key = coder.initmackey();  

        system.err.println("mac密钥:\n" + key);  

        // 验证hmac对于同一内容,同一密钥加密是否一致  

        assertarrayequals(coder.encrypthmac(inputdata, key), coder.encrypthmac(  

                inputdata, key));  

        biginteger md5 = new biginteger(coder.encryptmd5(inputdata));  

        system.err.println("md5:\n" + md5.tostring(16));  

        biginteger sha = new biginteger(coder.encryptsha(inputdata));  

        system.err.println("sha:\n" + sha.tostring(32));  

        biginteger mac = new biginteger(coder.encrypthmac(inputdata, inputstr));  

        system.err.println("hmac:\n" + mac.tostring(16));  

控制台输出:

console代码  

原文:  

简单加密  

base64加密后:  

566a5y2v5yqg5a+g  

base64解密后:  

mac密钥:  

ugxdhc+6ylrdaik++leftgwimbuyuj6mqhwyhsgf4trvkvbbsqvy/a22xu8xt1ruemdcww155bke  

pbipkd7qhg==  

md5:  

-550b4d90349ad4629462113e7934de56  

sha:  

91k9vo7p400cjkgfhjh0ia9qthsjagfn  

hmac:  

2287d192387e95694bdbba2fa941009a  

    base64的加密解密是双向的,可以求反解。 

    md5、sha以及hmac是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。其中hmac算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。

    单向加密的用途主要是为了校验数据在传输过程中是否被修改。

特别说明:尊重作者的劳动成果,转载请注明出处哦~~~http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt260