u=1413084622,3353334159&fm=21&gp=0

簡単なJava暗号化アルゴリズムには次のものがあります:

  1. BASE64は厳密に言えば、暗号化アルゴリズムではなくエンコーディング形式に属します。
  2. MD5(Message Digest algorithm 5、情報ダイジェストアルゴリズム)
  3. SHA(Secure Hash Algorithm、安全ハッシュアルゴリズム)
  4. HMAC(Hash Message Authentication Code、ハッシュメッセージ認証コード)

1. BASE64

Base64は、ネットワーク上で8ビットバイトコードを転送するために最も一般的なエンコーディング方式の1つです。RFC2045~RFC2049を参照してください。そこにMIMEの詳細な仕様があります。Base64エンコーディングは、HTTP環境下で長い識別情報を渡すために使用できます。例えば、Java PersistenceシステムのHibernateでは、Base64を使用して長い一意の識別子(通常は128ビットのUUID)を文字列にエンコードし、HTTPフォームやHTTP GET URLのパラメータとして使用しています。他のアプリケーションでも、バイナリデータをURL(隠しフォームフィールドを含む)に適した形式にエンコードする必要がよくあります。このとき、Base64エンコーディングは不可読性を持ち、エンコードされたデータは人間の目で直接見ることはできません。(出典:百度百科)

Java実装コード:

package com.cn.单向加密;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/*
BASE64的加密解密是双向的,可以求反解.
BASE64Encoder和BASE64Decoder是非官方JDK实现类。虽然可以在JDK里能找到并使用,但是在API里查不到。
JRE 中 sun 和 com.sun 开头包的类都是未被文档化的,他们属于 java, javax 类库的基础,其中的实现大多数与底层平台有关,
一般来说是不推荐使用的。 
BASE64 严格地说,属于编码格式,而非加密算法 
主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。
另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。 
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加密的。
*/

public class BASE64 {
    /**  
     * 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);   
    }  

    public static void main(String[] args) {

     String  str="12345678";

        try {
        String  result1= BASE64.encryptBASE64(str.getBytes());
         System.out.println("result1=====加密数据=========="+result1);

         byte  result2[]= BASE64.decryptBASE64(result1);
         String  str2=new String(result2);
         System.out.println("str2========解密数据========"+str2);
    } catch (Exception e) {
        e.printStackTrace();
    }

    }

}

2. MD5

MD5すなわちMessage-Digest Algorithm 5(メッセージダイジェストアルゴリズム5)で、情報伝達の完全性と一致性を確保するために使用されます。コンピュータで広く使われているハッシュアルゴリズムの1つ(別名:ダイジェストアルゴリズム、ハッシュアルゴリズム)で、主流のプログラミング言語にはほぼMD5実装があります。データ(漢字など)を別の固定長の値に変換することがハッシュアルゴリズムの基本原理であり、MD5の前身にはMD2、MD3とMD4。暗号化・復号化技術に広く使用され、ファイル検証によく使われます。検証?ファイルがどれだけ大きくても、MD5処理後は一意のMD5値が生成されます。例えば、現在のISO検証はすべてMD5検証です。どう使うのか?もちろんISOをMD5処理してMD5値を生成します。一般にlinux-ISOをダウンロードする人は、ダウンロードリンクの横にMD5の文字列が置かれているのを見たことがあるでしょう。これはファイルが一致しているかを検証するためです。

Java実装コード:

package com.cn.单向加密;

import java.math.BigInteger;
import java.security.MessageDigest;
/*
MD5(Message Digest algorithm 5,信息摘要算法) 
通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串
Digest:汇编
*/
public class MD5 {
    public static final String KEY_MD5 = "MD5";   

    public static  String  getResult(String inputStr)
    {
        System.out.println("=======加密前的数据:"+inputStr);
        BigInteger bigInteger=null;

        try {
         MessageDigest md = MessageDigest.getInstance(KEY_MD5);   
         byte[] inputData = inputStr.getBytes(); 
         md.update(inputData);   
         bigInteger = new BigInteger(md.digest());   
        } catch (Exception e) {e.printStackTrace();}
        System.out.println("MD5加密后:" + bigInteger.toString(16));   
        return bigInteger.toString(16);
    }

    public static void main(String args[])
    {
        try {
             String inputStr = "简单加密8888888888888888888";   
             getResult(inputStr);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

MD5アルゴリズムには以下の特徴があります:

1、圧縮性:任意の長さのデータに対し、計算されたMD5値の長さは常に固定です。
2、計算が容易:元データからMD5値を計算するのは簡単です。
3、改変耐性:元データにどんな変更を加えても、1バイトだけの修正であっても、得られるMD5値は大きく異なります。
4、弱衝突耐性:元データとそのMD5値が既知の場合、同じMD5値を持つデータ(すなわち偽造データ)を見つけることは非常に困難です。
5、強衝突耐性:異なる2つのデータで、同じMD5値を持つものを見つけることは非常に困難です。
MD5の役割は、大容量情報をデジタル署名ソフトウェアで秘密鍵に署名する前に「圧縮」して秘密の形式に変換することです(つまり、任意の長さのバイト列を一定の長さの16進数の数字列に変換します)。MD5以外にも、sha-1、RIPEMD、Havalなどが有名です。

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、ハッシュメッセージ認証コード)は、鍵ベースのハッシュアルゴリズムによる認証プロトコルです。メッセージ認証コードによる認証の原理は、公開関数と鍵を使用して固定長の値を認証識別子として生成し、この識別子を使用してメッセージの完全性を検証することです。鍵を使用して固定サイズの小さなデータブロック、すなわち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();
        }

    }

}

出典:http://www.cnblogs.com/oumyye/p/4593592.html