Java 에서의 암호화와 인코딩에 대해 간단히 정리합니다. 
 
  내용은 
 
  1. 인코딩
  2. 암호화 - 해쉬함수
  3. 암호화 - 대칭키 암호화 
  4. 암호화 - 공개키 암호화 

  이정도가 될것 같네요. 

  1. 인코딩 
 
   1) 문자열 인코딩(charector encoding)이란
 
      - 문자들의 집합을 저장하거나 통신에 사용할 목적으로 부호화 하는 방법을 말하며 그냥 '인코딩'이라고도 불립니다.
      - 문자열 인코딩은 ASCII, Base64 Encoding, URL Encoding 정도 구분할 수 있으면 됩니다.
 
   2) ASCII 
 
    - 미국정보교환표준부호(American Standard Code for Information Interchange; ASCII)는 영문 알파벳을 사용하는 대표적인 문자 인코딩
    - 7bit 이진수를 사용하며 0 ~ 127까지 128개의 문자로 구성되어 있다. 알파벳 52개, 숫자 10개, 32개 툭수 문자 + 공백 문자
 
    
 
 
 2. Base64 Encode/Decode 
 
- 2진 데이터를 아스키 텍스트로 변환하거나 그 반대로 변환하는 인코딩 방법
- 바이너리 등 특수문자를 포함한 데이터를 64종류의 인쇄가능한 문자열로 변환해주니다. 
- Base64란 8비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는 
공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념이다.
- base64는 64 진수를 의미하는 말로, 모든 데이터를 알파벳 (a ~ z, A-z)와 숫자 (0 ~ 9) 일부 기호 (+ /) 64 문자로 나타내는 인코딩 입니다
 
-> 전자 메일 전송을 위한 프로토콜(SMTP)  ASCII, MIME(Multipurpose Internet Mail Extensions) 사양, 메일에 동영상 등 전송을 위한 방식
-> 현재는 JSON 등 특수 문자를 포함하지 않도록 데이터를 base64로 인코딩하거나 
Web 페이지의 표시시 요청 수를 줄이기 위해 base64로 인코딩 된 이미지를 html에 그대로 삽입 등의 용도로 이용되고 있습니다
 
Java에서 Base64는 다음 3개지 정도로 사용할 수 있다. 
 
 - apache Commons Codec library
 - Base64 표준 API (Java8 이상)
 - JDK에 포함된 Base64
 
1) apache Commons Codec Library
 
일반적으로 가장 많이 사용하는 라이브러리이다. 
 
commons-codec 1.10 버전을 사용하여 예제를 작성해 보겠습니다. 
Maven pom.xml에 다음과 같이 작성합니다. 
 
<dependencies>
  <dependency>
    <groupid>commons-codec</groupid>
    <artifactid>commons-codec</artifactid>
    <version>1.10</version>
  </dependency>
</dependencies>
 
- 예제 코드 
 
import org.apache.commons.codec.binary.Base64;
 
......
 
public static String base64Encode(byte[] bytes) {
    return (new Base64()).encodeToString(bytes);
}
 
public static String base64Decode(String encoded) throws UnsupportedEncodingException {
    byte[] buff = (new Base64()).decode(encoded);
 return new String(buff);
}
 
 

- 예제 실행 결과

[commons-code.commons-codec]
Plain data: 테스트 데이터 Testing 1 2 3 +-=
Encode to Base64 : 7YWM7Iqk7Yq4IOuNsOydtO2EsCBUZXN0aW5nIDEgMiAzICstPQ==
Decode from Base64 :테스트 데이터 Testing 1 2 3 +-=
 

2) Base64 표준 API (Java8 이상)

 

 
- 예제 코드 
 
import java.util.Base64;
 
......
 
  public static String base64EncodeJava8(byte[] bytes) {
      return Base64.getEncoder().encodeToString(bytes);
  }
 
  public static String base64DecodeJava8(String encoded) throws IOException {
      return new String(Base64.getDecoder().decode(encoded));
  }
 
 

- 예제 실행 결과

[java8 java.util.BASE64]
Plain data: 테스트 데이터 Testing 1 2 3 +-=
Encode to Base64 : 7YWM7Iqk7Yq4IOuNsOydtO2EsCBUZXN0aW5nIDEgMiAzICstPQ==
Decode from Base64 :테스트 데이터 Testing 1 2 3 +-=
 

3) JDK에 포함된 Base64 (sun.misc.BASE64Decoder, BASE64Encoder)

 
- 예제 코드 
 
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
 
......
 
  public static String base64EncodeSun(byte[] bytes) {
          BASE64Encoder encoder = new BASE64Encoder();
      return encoder.encode(bytes);
  }
 
  public static String base64DecodeSun(String encoded) throws IOException {
          BASE64Decoder decoder = new BASE64Decoder();
      return new String(decoder.decodeBuffer(encoded));
  }
 
 

- 예제 실행 결과

-> 결과는 통일하게 나오지만 JDK 벤더에 종속적인 라이브러리이기 떄문에 쓰면 안됩니다.  (rt.jar에 있는 라이브러리)

[sun.misc.BASE64Encoder]
Plain data: 테스트 데이터 Testing 1 2 3 +-=
Encode to Base64 : 7YWM7Iqk7Yq4IOuNsOydtO2EsCBUZXN0aW5nIDEgMiAzICstPQ==
Decode from Base64 :테스트 데이터 Testing 1 2 3 +-=
 

 

3.  URL Encoding 

    - URL에 포함될 문자들이 안전하게 웹페이지에 전달 될 수 있도록 특수한 기능을 가진 문자들을 브라우저가 인코딩 한다.
    - URL, META 문자에 대한 인코딩이 필요하며, 기존 문자열 의 HEX값 앞에 %를 사용한다. 한글은 UTF-8 사용한다.

 

- 예제 코드 

 
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
 
......
 
  public static String base64EncodeSun(byte[] bytes) {
          BASE64Encoder encoder = new BASE64Encoder();
      return encoder.encode(bytes);
  }
 
  public static String base64DecodeSun(String encoded) throws IOException {
          BASE64Decoder decoder = new BASE64Decoder();
      return new String(decoder.decodeBuffer(encoded));
  }
 
 

- 예제 실행 결과

-> 결과는 통일하게 나오지만 JDK 벤더에 종속적인 라이브러리이기 떄문에 쓰면 안됩니다.  (rt.jar에 있는 라이브러리)

[sun.misc.BASE64Encoder]
Plain data: 테스트 데이터 Testing 1 2 3 +-=
Encode to Base64 : 7YWM7Iqk7Yq4IOuNsOydtO2EsCBUZXN0aW5nIDEgMiAzICstPQ==
Decode from Base64 :테스트 데이터 Testing 1 2 3 +-=
 
 
- 예제 코드 
 
    String data = "테스트 전송|데이터 <태그>";
    String dataconver  = null;
 
        dataconver = URLEncoder.encode(data,"UTF-8");
 
        System.out.println("data = "+ data);
        System.out.println("URL Encoded : "+ dataconver);
 
        dataconver = URLDecoder.decode(dataconver,"UTF-8");
    System.out.println("URL Decoded : "+ dataconver);
 
 

- 예제 실행 결과

-> 결과는 통일하게 나오지만 JDK 벤더에 종속적인 라이브러리이기 떄문에 쓰면 안됩니다.  (rt.jar에 있는 라이브러리)

data = 테스트 전송|데이터 <태그>
URL Encoded : %ED%85%8C%EC%8A%A4%ED%8A%B8+%EC%A0%84%EC%86%A1%7C%EB%8D%B0%EC%9D%B4%ED%84%B0+%3C%ED%83%9C%EA%B7%B8%3E
URL Decoded : 테스트 전송|데이터 <태그>