本篇内容简要介绍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代码
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