자바 암호 화 기술

●  BASE 64 는 암호 화 알고리즘 이 아 닌 인 코딩 형식 에 속한다.    ●  MD5(메시지 다이제스트 알고리즘 5,정보 요약 알고리즘)    ●  SHA(보안 해시 알고리즘,보안 해시 알고리즘)    ●  HMAC(해시 메시지 인증 코드,해시 메시지 감별 코드)
    복잡 한 대칭 암호 화(DES,PBE),비대 칭 암호 화 알고리즘:
    ●  DES(데이터 암호 화 표준,데이터 암호 화 알고리즘)    ●  PBE(암호 기반 암호 화,암호 기반 인증)    ●  RSA(알고리즘 이름 은 발명자 의 이름 으로 Ron Rivest,AdiShamir 와 Leonard Adleman)    ●  DH(Diffie-Hellman 알고리즘,키 일치 프로 토 콜)    ●  DSA(디지털 서명 알고리즘,디지털 서명)    ●  ECC(Elliptic Curves Cryptography,타원 곡선 암호 코딩 학)
    이 글 은 BASE 64,MD5,SHA,HMAC 의 몇 가지 방법 을 간략하게 소개 한다.
    MD5,SHA,HMAC 라 는 세 가지 암호 화 알고리즘 은 역 암호 화 라 고 할 수 있 고 복호화 할 수 없 는 암호 화 방법 이다.우 리 는 보통 그들 을 암호 화의 기초 로 삼 는 다.단순 한 상기 세 가지 암호 화 는 믿 을 수 없다.
 
   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 를 통 해 암호 화 된 것 을 발견 할 수 있 습 니 다.
    자바 코드 를 통 해 다음 과 같이 구현 합 니 다:
/** *//**     
 * BASE64    http://www.bt285.cn http://www.5a520.cn   
 *      
 * @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 64Encoder,BASE 64Decoder 두 가지 유형 입 니 다.우 리 는 대응 하 는 방법 만 알 면 됩 니 다.또한 BASE 암호 화 후 생 성 되 는 바이트 의 자릿수 는 8 의 배수 이 며,만약 자릿수 가 부족 하면=기호 로 채 웁 니 다.
  
   MD5
    MD5-message-digest algorithm 5(정보-요약 알고리즘)의 줄 임 말로 암호 화 와 복호화 기술 에 광범 위 하 게 사용 되 며 파일 검사 에 자주 사용 된다.검사파일 이 아무리 크 더 라 도 MD5 를 거 친 후에 유일한 MD5 값 을 생 성 할 수 있 습 니 다.현재 ISO 검사 와 같이 모두 MD5 검사 입 니 다.어떻게?당연히 ISO 를 MD5 를 거 쳐 MD5 의 값 을 만들어 야 한다.일반적으로 linux-ISO 를 다운로드 하 는 친구 들 은 다운로드 링크 옆 에 MD5 꼬치 가 놓 여 있 는 것 을 본 적 이 있다.파일 이 일치 하 는 지 검증 하 는 데 쓰 인 다.
    자바 코드 를 통 해 다음 과 같이 구현 합 니 다:
/** *//**     
 * MD5   http://www.bt285.cn http://www.5a520.cn     
 *      
 * @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();       
      
}   

  일반적으로 우 리 는 상술 한 MD5 암호 화 를 직접 사용 하지 않 는 다.보통 MD5 에서 생 성 된 바이트 배열 을 BASE 64 에 건 네 주 고 암호 화하 여 해당 하 는 문자열 을 얻 습 니 다.
  
  SHA
    SHA(Secure Hash Algorithm,보안 해시 알고리즘),디지털 서명 등 암호학 응용 에서 중요 한 도구 로 전자상거래 등 정보 보안 분야 에 널리 활용 된다.비록 SHA 와 MD5 는 충돌 법 을 통 해 모두 풀 렸 지만 SHA 는 여전히 공 인 된 안전 암호 화 알고리즘 으로 MD5 보다 안전 하 다.
    자바 코드 를 통 해 다음 과 같이 구현 합 니 다:
/** *//**     
     * SHA   http://www.5a520.cn http://www.bt285.cn    
     *      
     * @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
    HMAC(Hash Message Authentication Code,해시 메시지 감별 코드,키 기반 Hash 알고리즘 인증 프로 토 콜.메시지 감별 코드 가 감별 을 실현 하 는 원 리 는 공개 함수 와 키 로 고정된 길이 의 값 을 만들어 인증 표지 로 하고 이 표지 로 메시지 의 완전 성 을 감별 하 는 것 이다.키 를 사용 하여 고정 크기 의 작은 데이터 블록,즉 MAC 를 만 들 고 메시지 에 추가 한 다음 전송 합 니 다.수신 자 는 발송 자 와 공유 하 는 키 를 이용 하여 감별 인증 등 을 한다.
    자바 코드 를 통 해 다음 과 같이 구현 합 니 다:
/** *//**     
 *    HMAC    http://www.guihua.org  http://www.feng123.com   
 *      
 * @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 sun.misc.BASE64Decoder;       
import sun.misc.BASE64Encoder;       
      
/** *//**     
 *         http://www.bt285.cn http://www.feng123.com   
 *      
 * @author        
 * @version 1.0     
 * @since 1.0     
 */      
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);       
      
    }       
}   

 
테스트 클래스 를 하나 더 드 립 니 다:
import static org.junit.Assert.*;    
   
import org.junit.Test;    
   
/**   
 *   
 * @author     http://www.feng123.com   
 * @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)); }

좋은 웹페이지 즐겨찾기