BASE64,MD5,SHA,HMAC加密解决算法

 代码如下 复制代码
package com.ice.webos.util.security;
 
 import java.io.UnsupportedEncodingException;
 import java.math.BigInteger;
 import java.security.Key;
 import java.security.MessageDigest;
 import java.security.SecureRandom;
 
 import javax.crypto.Cipher;
 import javax.crypto.KeyGenerator;
 import javax.crypto.Mac;
 import javax.crypto.SecretKey;
 import javax.crypto.SecretKeyFactory;
 import javax.crypto.spec.DESKeySpec;
 import javax.crypto.spec.SecretKeySpec;
 
 import sun.misc.BASE64Decoder;
 import sun.misc.BASE64Encoder;
 
 /**
  * <ul>
  * <li>BASE64的加密解密是双向的,可以求反解。</li>
  * <li>MD5、SHA以及HMAC是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。</li>
  * <li>HMAC算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。</li>
  * <li>DES DES-Data Encryption Standard,即数据加密算法。
  * DES算法的入口参数有三个:Key、Data、Mode。
  * <ul>
  * <li>Key:8个字节共64位,是DES算法的工作密钥;</li>
  * <li>Data:8个字节64位,是要被加密或被解密的数据;</li>
  * <li>Mode:DES的工作方式,有两种:加密或解密。</li>
  * </ul>
  * </li>
  * <ul>
  *
  * @author Ice_Liu
  *
  */
 public class CryptUtil {
     private static final String KEY_MD5 = "MD5";
     private static final String KEY_SHA = "SHA";
     /**
      * MAC算法可选以下多种算法
      *
      * <pre>
      * 
      * HmacMD5 
      * HmacSHA1 
      * HmacSHA256 
      * HmacSHA384 
      * HmacSHA512
      * </pre>
 */
     public static final String KEY_MAC = "HmacMD5";
 
     /**
      * BASE64解密
      *
      * @param key
      * @return
      * @throws Exception
 */
     public static byte[] decryptBASE64(String key) throws Exception {
         return (new BASE64Decoder()).decodeBuffer(key);
     }
 
     /**
      * BASE64 加密
      *
      * @param key
      * @return
      * @throws Exception
 */
     public static String encryptBASE64(byte[] key) throws Exception {
         return (new BASE64Encoder()).encodeBuffer(key);
     }
 
     /**
      * MD5加密
      *
      * @param data
      * @return
      * @throws Exception
 */
     public static byte[] encryptMD5(byte[] data) throws Exception {
 
         MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
         md5.update(data);
 
         return md5.digest();
 
     }
 
     /**
      * 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密钥
      *
      * @return
      * @throws Exception
 */
     public static String initMacKey() throws Exception {
         KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
         SecretKey secretKey = keyGenerator.generateKey();
         return encryptBASE64(secretKey.getEncoded());
     }
 
     /**
      * HMAC 加密
      *
      * @param data
      * @param key
      * @return
      * @throws Exception
 */
     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);
     }
 
     /**
      * DES 算法 <br>
      * 可替换为以下任意一种算法,同时key值的size相应改变。
      *
      * <pre>
      * DES                  key size must be equal to 56
      * DESede(TripleDES)    key size must be equal to 112 or 168
      * AES                  key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available
      * Blowfish             key size must be multiple of 8, and can only range from 32 to 448 (inclusive)
      * RC2                  key size must be between 40 and 1024 bits
      * RC4(ARCFOUR)         key size must be between 40 and 1024 bits
      * </pre>
 */
     public static final String ALGORITHM = "DES";
 
     /**
      * DES 算法转换密钥<br>
      *
      * @param key
      * @return
      * @throws Exception
 */
     private static Key toKey(byte[] key) throws Exception {
         SecretKey secretKey = null;
         if (ALGORITHM.equals("DES") || ALGORITHM.equals("DESede")) {
             DESKeySpec dks = new DESKeySpec(key);
             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
             secretKey = keyFactory.generateSecret(dks);
         } else {
             // 当使用其他对称加密算法时,如AES、Blowfish等算法时,用下述代码替换上述三行代码
             secretKey = new SecretKeySpec(key, ALGORITHM);
         }
         return secretKey;
     }
 
     /**
      * DES 算法解密
      *
      * @param data
      * @param key
      * @return
      * @throws Exception
 */
     public static byte[] decrypt(byte[] data, String key) throws Exception {
         Key k = toKey(decryptBASE64(key));
         Cipher cipher = Cipher.getInstance(ALGORITHM);
         cipher.init(Cipher.DECRYPT_MODE, k);
         return cipher.doFinal(data);
     }
 
     /**
      * DES 算法加密
      *
      * @param data
      * @param key
      * @return
      * @throws Exception
 */
     public static byte[] encrypt(byte[] data, String key) throws Exception {
         Key k = toKey(decryptBASE64(key));
         Cipher cipher = Cipher.getInstance(ALGORITHM);
         cipher.init(Cipher.ENCRYPT_MODE, k);
         return cipher.doFinal(data);
     }
 
     /**
      * DES 算法生成密钥
      *
      * @return
      * @throws Exception
 */
     public static String initKey() throws Exception {
         return initKey(null);
     }
 
     /**
      * DES 算法生成密钥
      *
      * @param seed
      * @return
      * @throws Exception
 */
     public static String initKey(String seed) throws Exception {
         SecureRandom secureRandom = null;
         if (seed != null) {
             secureRandom = new SecureRandom(decryptBASE64(seed));
         } else {
             secureRandom = new SecureRandom();
         }
         KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM);
         kg.init(secureRandom);
         SecretKey secretKey = kg.generateKey();
         return encryptBASE64(secretKey.getEncoded());
     }
 
     public static void main(String[] args) {
         try {
             String s = "阿伯才的覆盖";
             String b = CryptUtil.encryptBASE64(s.getBytes("UTF-8"));
             System.out.println("BASE64加密后:" + b);
             byte[] c = CryptUtil.decryptBASE64(b);
             System.out.println("BASE64解密后:" + new String(c, "UTF-8"));
 
             c = encryptMD5(s.getBytes());
             System.out.println("MD5   加密后:" + new BigInteger(c).toString(16));
 
             c = encryptSHA(s.getBytes());
             System.out.println("SHA   加密后:" + new BigInteger(c).toString(16));
 
             String key = initMacKey();
             System.out.println("HMAC密匙:" + key);
             c = encryptHMAC(s.getBytes(), key);
             System.out.println("HMAC  加密后:" + new BigInteger(c).toString(16));
 
             key = initKey();
             System.out.println(ALGORITHM + "密钥:t" + key);
             c = encrypt(s.getBytes("UTF-8"), key);
             System.out.println(ALGORITHM + "   加密后:" + new BigInteger(c).toString(16));
             c = decrypt(c, key);
             System.out.println(ALGORITHM + "   解密后:" + new String(c, "UTF-8"));
         } catch (UnsupportedEncodingException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } catch (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
     }
 }
时间: 2024-12-27 12:20:46

BASE64,MD5,SHA,HMAC加密解决算法的相关文章

javascript实现base64 md5 sha1 密码加密_javascript技巧

1.base64加密 在页面中引入base64.js文件,调用方法为: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>base64加密</title> <script type="text/javascript" src="base64.js"></script> <scr

golang 中的md5 、hmac、sha1算法的简单实现

package main import ( "crypto/hmac" "crypto/md5" "crypto/sha1" "encoding/hex" "fmt" ) func Md5(data string) string { md5 := md5.New() md5.Write([]byte(data)) md5Data := md5.Sum([]byte("")) return

Java实现 Base64、MD5、MAC、HMAC加密(转)

  开始对那些基本的加密还不怎么熟练,然后总结了些,写了一个测试:支持 Base64.MD5.MAC.HMAC加密,长话短说,我们都比较喜欢自己理解,看代码吧! 采用的输UTF-8的格式... package codec; import java.security.MessageDigest; import javax.crypto.KeyGenerator; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax

java实现Base64加密解密算法_java

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范.Base64编码可用于在HTTP环境下传递较长的标识信息.例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.

php结合md5的加密解密算法实例_php技巧

本文实例讲述了php结合md5的加密解密算法.分享给大家供大家参考,具体如下: <?php /* * Created on 2016-9-30 * */ function encrypt($data, $key) { $key = md5($key); $x = 0; $len = strlen($data); $l = strlen($key); for ($i = 0; $i < $len; $i++) { if ($x == $l) { $x = 0; } $char .= $key{$

Android数据加密之SHA安全散列算法_Android

前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好奇心,所以趁着晚上没啥事,来学习一下. 其他几种加密方式:  •Android数据加密之Rsa加密  •Android数据加密之Aes加密  •Android数据加密之Des加密  •Android数据加密之MD5加密  •Android数据加密之Base64编码算法 SHA加密算法      SH

java中spring-shiro实现密码的MD5盐值加密

看了网上很多教程,都提到有配置spring shiro的密码加密方式,甚至给出了自定义的Class来实现.却很少有通过配置来解决的. 密码的盐值加密方式应该是非常通用的,也可以算是基础吧.按理说spring shiro不可能没有实现,让用户自己去实现吧. 通过读源码看各种关系,摸索出shiro的MD5盐值加密方式,分享一下 (shiro的maven仓库中的source从来都是个空文件,github上的源码又没有stable版本的代码,要调试很恼火),当然阅读源码可以直接到github上,http

Android数据加密之SHA安全散列算法

前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好奇心,所以趁着晚上没啥事,来学习一下. 其他几种加密方式: •Android数据加密之Rsa加密  •Android数据加密之Aes加密  •Android数据加密之Des加密  •Android数据加密之MD5加密  •Android数据加密之Base64编码算法 SHA加密算法 SHA(Secu

详解.NET下的加密解密算法(1) 哈希加密

.NET有丰富的加密解密API库供我们使用,本博文总结了.NET下的Hash散列算法,并制作成简单的DEMO,希望能对大家 有所帮助. MD5 using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptography; namespace EncryptAndDecrypt { public class MD5 { public byte[] Hash(byte[]