首页 > 代码库 > java-信息安全(一)-BASE64,MD5,SHA,HMAC
java-信息安全(一)-BASE64,MD5,SHA,HMAC
概述
信息安全基本概念:
- BASE64 编码格式
- MD5(Message Digest algorithm 5,信息摘要算法)
- SHA(Secure Hash Algorithm,安全散列算法)
- HMAC(Hash Message Authentication Code,散列消息鉴别码)
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.)
使用:推荐使用 org.apache.commons.codec.binary.Base64
@Test public void testEncodeBase64() throws Exception { byte[] encodeBase64 = org.apache.commons.codec.binary.Base64 .encodeBase64("进行Base64".getBytes("UTF-8")); System.out.println(new String(encodeBase64));//6L+b6KGMQmFzZTY0 } @Test public void testSDecodeBase64() throws Exception { byte[] decodeBase64 = org.apache.commons.codec.binary.Base64 .decodeBase64("6L+b6KGMQmFzZTY0"); System.out.println(new String(decodeBase64));//进行Base64 }
MD5
Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
使用:
@Test public void testMD5() throws Exception { String md5Msg = msgSafeBase("测试MD5","MD5"); System.out.println(md5Msg);// c2dbb895a66c3ca924ccdbea49fa6884 } public String msgSafeBase(String msg, String algorithmName) throws Exception { MessageDigest m = MessageDigest.getInstance(algorithmName); m.update(msg.getBytes("UTF8")); byte s[] = m.digest(); return Hex.encodeHexString(s); }
SHA
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。
sha1已不推荐使用
使用:
@Test public void testSHA() throws Exception { // SHA-1,SHA-256,SHA-384,和SHA-512 String hashMsg = msgSafeBase("测试SHA", "SHA-1"); System.out.println(hashMsg); // sha1:9bfec0ff7027c76c28fdaa51bd5a619c5e2f69bb } public String msgSafeBase(String msg, String algorithmName) throws Exception { MessageDigest m = MessageDigest.getInstance(algorithmName); m.update(msg.getBytes("UTF8")); byte s[] = m.digest(); return Hex.encodeHexString(s); }
HMAC
HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。
运算作用
使用:
@Test public void testHashMsgCode() throws Exception { String macKey = initMacKey(); System.out.println(macKey); //vTVhh1xBdDTm9/TZhVsOK0+G/Aw2fkCx0gC6KcM7o2lbCy6DyatcUSe66PTu70E7J0r/hhtodcZBPuLI4/aCgw== String msgCode=hashMsgCode("测试HMAC".getBytes(),macKey); System.out.println(msgCode); //7e4f0f95cfef2c8f5af9799d03798e76 } public static String initMacKey() throws Exception { // HmacMD5,HmacSHA1,HmacSHA256,HmacSHA384,HmacSHA512 KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5"); SecretKey secretKey = keyGenerator.generateKey(); return new String(Base64.encodeBase64(secretKey.getEncoded())); } public static String hashMsgCode(byte[] data, String key) throws Exception { SecretKey secretKey = new SecretKeySpec(Base64.decodeBase64(key), "HmacMD5"); Mac mac = Mac.getInstance(secretKey.getAlgorithm()); mac.init(secretKey); return new String(Hex.encodeHex(mac.doFinal(data))); }
java-信息安全(一)-BASE64,MD5,SHA,HMAC