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 : 테스트 전송|데이터 <태그>