Java暗号化技術—BASE 64と一方向暗号化アルゴリズムMD 5&SHA&MAC

10497 ワード

http://snowolf.iteye.com/blog/379860 
基本的な一方向暗号化アルゴリズムのように:
  • BASE 64は、厳密には暗号化アルゴリズム
  • ではなく符号化フォーマットに属する.
  • MD 5(Message Digest algorithm 5、情報要約アルゴリズム)
  • SHA(Secure Hash Algorithm,セキュアハッシュアルゴリズム)
  • HMAC(Hash Message Authentication Code)
  • 複雑な対称暗号化(DES、PBE)、非対称暗号化アルゴリズム:
  • DES(Data Encryption Standard,データ暗号化アルゴリズム)
  • PBE(Password-based encryption、パスワード検証ベース)
  • RSA(アルゴリズムの名前は発明者の名前で命名:Ron Rivest,AdiShamir,Leonard Adleman)
  • DH(Diffie-Hellmanアルゴリズム、鍵一致プロトコル)
  • DSA(Digital Signature Algorithm、デジタル署名)
  • ECC(Elliptic Curves Cryptography,楕円曲線暗号符号化学)
  • MD5

    SHA

    HMAC
    この3つの暗号化アルゴリズムは,非可逆暗号化と呼ばれ,復号不可能な暗号化方法である.私たちは通常、彼らを暗号化の基礎としているだけです.単純な以上の3種類の暗号化は信頼できない
    BASE64 
    RFC 2045の定義に従って、Base 64は、Base 64コンテンツ転送符号化が、任意のシーケンスの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情報を切り取ると、ログイン操作のユーザー名、パスワードフィールドがBASE 64で暗号化されていることがわかります. 
    Java加密技术—BASE64与单向加密算法MD5&SHA&MAC
    	/**
    	 * 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);
    	}
    
     
    主にBASE 64 Encoder、BASE 64 Decoderの2つのクラスであり、対応する方法を知るだけでよい.なお、BASE暗号化後に発生するバイト数は8の倍数であり、ビット数が足りなければ
    =
    記号を入力します. 
     
    MD5
     
    MD5 -- message-digest algorithm 5 (情報-ダイジェストアルゴリズム)略語で、暗号化や復号化技術に広く用いられ、ファイル検証によく用いられる.検証?ファイルがどんなに大きくてもMD 5を経由して唯一のMD 5値を生成することができる.現在のISO検証のように、すべてMD 5検証である.どのように使うのか.もちろん、ISOをMD 5を経由してMD 5を生成する値である.一般的にlinux-ISOをダウンロードしている友人は、ダウンロードリンクの横にMD 5の列が置かれているのを見たことがある.ファイルが一致しているかどうかを確認するために使用します. 
    Java加密技术—BASE64与单向加密算法MD5&SHA&MAC
     
    HMAC
     
    HMAC(Hash Message Authentication Code、ハッシュメッセージ識別コード、鍵に基づくHashアルゴリズムの認証プロトコル.メッセージ識別コードが識別を実現する原理は、公開関数と鍵で固定長の値を認証識別として生成し、この識別でメッセージの完全性を識別することである.1つの鍵を用いて固定サイズの小さなデータブロック、すなわちMACを生成し、これをMACに加えるメッセージを送信します.受信者は、送信者と共有する鍵を用いて認証等を行う. 
    Java加密技术—BASE64与单向加密算法MD5&SHA&MAC
    	/**
    	 * 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();
    
    	}
    
     
    	/**
    	 *    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);
    
    	}
    
     
    完全なクラスを次に示します.
    import java.security.MessageDigest;
    
    import javax.crypto.KeyGenerator;
    import javax.crypto.Mac;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    
    /**
     *       
     * 
     * @author   
     * @version 1.0
     * @since 1.0
     */
    @SuppressWarnings("restriction")
    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
         * @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);
    
        }
    }
    

     
    テストクラスをもう1つ指定します.
    import static org.junit.Assert.assertArrayEquals;
    import static org.junit.Assert.assertEquals;
    
    import java.math.BigInteger;
    
    import org.junit.Test;
    
    /**
     * 
     * @author lee
     * @version 1.0
     * @since 1.0
     */
    public class CoderTest {
    
        @Test
        public void test() throws Exception {
            String inputStr = "    ";
            System.err.println("  :
    " + inputStr); byte[] inputData = inputStr.getBytes(); String code = Coder.encryptBASE64(inputData); System.err.println("BASE64 :
    " + code); byte[] output = Coder.decryptBASE64(code); String outputStr = new String(output); System.err.println("BASE64 :
    " + 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 :
    " + key); // HMAC , assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC( inputData, key)); BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData)); System.err.println("MD5:
    " + md5.toString(16)); BigInteger sha = new BigInteger(Coder.encryptSHA(inputData)); System.err.println("SHA:
    " + sha.toString(32)); BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr)); System.err.println("HMAC:
    " + mac.toString(16)); } }

     
    コンソール出力:
     
      :
        
    BASE64   :
    566A5Y2V5Yqg5a+G
    
    BASE64   :
        
    Mac  :
    dl0GAp2yP0qRfylxGLSdAivpHaby4kq6/zT/BcWYYC6Q1BZEibybyJbP4WXPKv1n1LPdwFVJO9lq
    dIj8Mxv26Q==
    
    MD5:
    -550b4d90349ad4629462113e7934de56
    SHA:
    91k9vo7p400cjkgfhjh0ia9qthsjagfn
    HMAC:
    2287d192387e95694bdbba2fa941009a
    

     
     
    BASE 64の暗号解読は双方向であり、逆解を求めることができる.
     
    MD 5、SHAおよびHMACは一方向暗号化であり、任意のデータが暗号化されると、伝送中にデータが変更されたかどうかを検証するために通常使用される唯一の暗号化列しか生成されない.ここでHMACアルゴリズムには鍵があり、データ伝送中のセキュリティを強化し、アルゴリズム外の制御不能要素を強化している.一方向暗号化の用途は,主に伝送中にデータが変更されたかどうかを検証するためである.