3.SHA
  安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名可以视为对此明文的数字签名。
  java实现:
  package com.cn.单向加密;
  import java.math.BigInteger;
  import java.security.MessageDigest;
  /*
  SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,
  被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了,
  但是SHA仍然是公认的安全加密算法,较之MD5更为安全*/
  public class SHA{
  public static final String KEY_SHA="SHA";
  public static String getResult(String inputStr)
  {
  BigInteger sha=null;
  System.out.println("=======加密前的数据:"+inputStr);
  byte[]inputData=inputStr.getBytes();
  try{
  MessageDigest messageDigest=MessageDigest.getInstance(KEY_SHA);
  messageDigest.update(inputData);
  sha=new BigInteger(messageDigest.digest());
  System.out.println("SHA加密后:"+sha.toString(32));
  }catch(Exception e){e.printStackTrace();}
  return sha.toString(32);
  }
  public static void main(String args[])
  {
  try{
  String inputStr="简单加密";
  getResult(inputStr);
  }catch(Exception e){
  e.printStackTrace();
  }
  }
  }
  SHA-1与MD5的比较
  因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:
  l对强行攻击的安全性:显著和重要的区别是SHA-1摘要比MD5摘要长32位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
  l对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
  l速度:在相同的硬件上,SHA-1的运行速度比MD5慢。
  4.HMAC
  HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。
  java实现代码:
  package com.cn.单向加密;
  /*
  HMAC
  HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。
  消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。
  使用一个密钥生成一个固定大小的小数据块,
  即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。*/
  import javax.crypto.KeyGenerator;
  import javax.crypto.Mac;
  import javax.crypto.SecretKey;
  import javax.crypto.spec.SecretKeySpec;
  import com.cn.comm.Tools;
  /**
  *基础加密组件
  */
  public abstract class HMAC{
  public static final String KEY_MAC="HmacMD5";
  /**
  *初始化HMAC密钥
  *
  *@return
  *@throws Exception
  */
  public static String initMacKey()throws Exception{
  KeyGenerator keyGenerator=KeyGenerator.getInstance(KEY_MAC);
  SecretKey secretKey=keyGenerator.generateKey();
  return BASE64.encryptBASE64(secretKey.getEncoded());
  }
  /**
  *HMAC加密:主要方法
  *
  *@param data
  *@param key
  *@return
  *@throws Exception
  */
  public static String encryptHMAC(byte[]data,String key)throws Exception{
  SecretKey secretKey=new SecretKeySpec(BASE64.decryptBASE64(key),KEY_MAC);
  Mac mac=Mac.getInstance(secretKey.getAlgorithm());
  mac.init(secretKey);
  return new String(mac.doFinal(data));
  }
  public static String getResult1(String inputStr)
  {
  String path=Tools.getClassPath();
  String fileSource=path+"/file/HMAC_key.txt";
  System.out.println("=======加密前的数据:"+inputStr);
  String result=null;
  try{
  byte[]inputData=inputStr.getBytes();
  String key=HMAC.initMacKey();/*产生密钥*/
  System.out.println("Mac密钥:==="+key);
  /*将密钥写文件*/
  Tools.WriteMyFile(fileSource,key);
  result=HMAC.encryptHMAC(inputData,key);
  System.out.println("HMAC加密后:==="+result);
  }catch(Exception e){e.printStackTrace();}
  return result.toString();
  }
  public static String getResult2(String inputStr)
  {
  System.out.println("=======加密前的数据:"+inputStr);
  String path=Tools.getClassPath();
  String fileSource=path+"/file/HMAC_key.txt";
  String key=null;;
  try{
  /*将密钥从文件中读取*/
  key=Tools.ReadMyFile(fileSource);
  System.out.println("getResult2密钥:==="+key);
  }catch(Exception e1){
  e1.printStackTrace();}
  String result=null;
  try{
  byte[]inputData=inputStr.getBytes();
  /*对数据进行加密*/
  result=HMAC.encryptHMAC(inputData,key);
  System.out.println("HMAC加密后:==="+result);
  }catch(Exception e){e.printStackTrace();}
  return result.toString();
  }
  public static void main(String args[])
  {
  try{
  String inputStr="简单加密";
  /*使用同一密钥:对数据进行加密:查看两次加密的结果是否一样*/
  getResult1(inputStr);
  getResult2(inputStr);
  }catch(Exception e){
  e.printStackTrace();
  }
  }
  }