안녕하세요. 오늘은 단방향 암호화는 무엇이고 종류에는 무엇이 있는지 알아보도록 하겠습니다.
단방향 암호화(One-way Encryption)란?
⭐ 데이터를 한쪽 방향으로만 암호화를 한다는 의미로 평문을 암호문으로 암호화할 순 있지만 암호문을 평문으로 바꾸는 복호화는 불가능하므로 암호화만 가능하기 때문에 단방향 암호화라고 합니다.
⭐ DB로 비밀번호를 관리할 때 유용하게 사용됩니다.
But, 단방향 암호화 방식으로 저장할 경우 데이터베이스가 유출되어도 안전하지만 유저가 비밀번호를 잊어버렸을 경우에는 찾기가 불가능합니다. 그래서 대부분의 사이트는 유저가 비밀번호 찾기를 할 경우 메일이나 SMS을 통해 새로운 비밀번호로 변경하도록 하더라고요 :)
⭐ 대표적으로 MD5와 SHA-256 암호화 알고리즘이 있습니다.
단방향 암호화 종류
단방향 암호화는 주로 암호화 *해시 함수를 이용한 Hash 암호화 방식을 사용합니다.
※ 여기서 '해시함수'란? 어떤 크기의 입력 데이터를 넣어도 항상 동일한 크기의 데이터(해시 값 또는 해시 코드)로 반환 시켜주는 함수입니다.
지금부터 설명드릴 두 가지 방식은 모두 MessageDigest라는 클래스를 이용하여 암호화를 하는데요, 방식에 대해 설명드리기 전에 해당 클래스에 대한 설명을 먼저 드리자면
MessageDigest란?
자바에서 단방향 해시 함수 값을 구할 때 사용되는 클래스입니다.
비밀번호를 해시화하여 저장하고 싶을 때나 특정 정보를 암호화하고 싶을 때 주로 사용됩니다.
⭐ MD5(Message Digest 5)
- 128비트(16바이트)의 고정된 출력 값을 생성합니다.
- 현재는 보안 취약점으로 인해 사용이 권장되지 않는 해시 함수입니다.
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Encryption {
public static String md5(String pwd) {
String MD5 = "";
try {
MessageDigest md = MessageDigest.getInstance("MD5"); // 1
md.update(pwd.getBytes()); // 2
byte byteData[] = md.digest(); // 3
StringBuffer sb = new StringBuffer(); // 4
for(int i=0; i<byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); // 5
}
MD5 = sb.toString(); // 6
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
MD5 = null;
}
return MD5; // 7
}
}
위 코드는 비밀번호를 입력받아 MD5 해시 값으로 암호화해 주는 코드입니다. 제가 예전에 웹 프로젝트에서 회원가입을 구현할 때 사용했었던 코드인데요, 간단하게 코드에 대해 설명하자면
1. MD5 해시를 생성하기 위한 MessageDigest 객체를 생성한 후
2. 입력받은 비밀번호(문자열)를 바이트 배열로 변환하여 MessageDigest에 업데이트합니다.
3. 해시된 바이트 데이터를 가져옵니다.
4. 해시 값을 저장할 StringBuffer 객체를 생성한 후
5. 바이트 데이터를 16진수 문자열로 변환하여 StringBuffer 객체에 담습니다.
6. 문자열로 변환된 StringBuffer의 내용을 MD5 변수에 저장합니다.
7. MD5 해시 값을 반환합니다.
데이터베이스에 MD5 해시 값이 저장되었습니다! 😆
⭐ SHA-256(Secure Hash Algorithm 256-bit)
- 256비트(또는 64 문자) 길이의 해시 값을 생성합니다.
- 안전하고 강력한 알고리즘으로 암호학적으로 안전한 해시를 생성하기 때문에 비밀번호 보안, 데이터베이스 보안 등 다양하게 사용됩니다.
import java.security.MessageDigest;
public class Encryption {
public static String sha256(String pwd) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-256"); // 1
md.update(pwd.getBytes()); // 2
byte byteData[] = md.digest(); // 3
StringBuffer sb = new StringBuffer();
for(int i=0; i<byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); // 4
}
// 5
StringBuffer hexString = new StringBuffer();
for(int i=0; i<byteData.length; i++) {
String hex = Integer.toHexString(0xff & byteData[i]);
if(hex.length() == 1) {
hexString.append('0'); // 6
}
hexString.append(hex);
}
return hexString.toString(); // 7
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
}
위 코드는 비밀번호를 입력받아 SHA-256 해시 값으로 암호화해주는 코드입니다. 제가 현재 진행 중인 개인 웹 프로젝트에서 회원가입을 구현하는 데 사용하고 있는 코드인데요, 간단하게 코드에 대해 설명하자면
1. SHA-256 해시를 생성할 MessageDigest 객체를 생성한 후
2. 입력받은 비밀번호를 바이트 배열로 변환하여 해시 생성을 위해 업데이트합니다.
3. 해시된 바이트 데이터를 가져온 후 해시 값을 저장할 StringBuffer 객체를 생성합니다.
4. 해시 값 바이트 배열을 16진수 문자열로 변환하고 StringBuffer 객체에 담습니다.
5. 또 다른 방식으로 16진수 문자열로 변환합니다.
6. 0xff로 비트 연산 후 16진수로 변환하여 1자리 수일 경우 0을 추가합니다.
7. SHA-256 해시 값을 반환합니다.
휴.. 갈 길이 머네요 😜😜
'Languages > JAVA' 카테고리의 다른 글
[JAVA] 객체지향 프로그래밍(OOP)이란? (0) | 2024.12.10 |
---|---|
[JAVA] 스트림(Stream)이란? (개념, 메서드 정리) (0) | 2024.11.04 |
[JAVA] JVM(자바 가상 머신)이란? (역할, 동작 과정, 구성 요소) (0) | 2024.09.23 |
[JAVA] 프로토타입 패턴&싱글톤 패턴(new, getInstance()의 차이) (0) | 2023.11.02 |