[JAVA] 자바 MD5, SHA-256 단방향 암호화(feat. MessageDigest)(+코드예제)

728x90

 

안녕하세요. 오늘은 단방향 암호화는 무엇이고 종류에는 무엇이 있는지 알아보도록 하겠습니다.

 

단방향 암호화(One-way Encryption)란?

⭐ 데이터를 한쪽 방향으로만 암호화를 한다는 의미로 평문을 암호문으로 암호화할 순 있지만 암호문을 평문으로 바꾸는 복호화는 불가능하므로 암호화만 가능하기 때문에 단방향 암호화라고 합니다.

 

⭐ DB로 비밀번호를 관리할 때 유용하게 사용됩니다.

But, 단방향 암호화 방식으로 저장할 경우 데이터베이스가 유출되어도 안전하지만 유저가 비밀번호를 잊어버렸을 경우에는 찾기가 불가능합니다. 그래서 대부분의 사이트는 유저가 비밀번호 찾기를 할 경우 메일이나 SMS을 통해 새로운 비밀번호로 변경하도록 하더라고요 :)

 

⭐ 대표적으로 MD5와 SHA-256 암호화 알고리즘이 있습니다.

 

 

 

 

 

단방향 암호화 종류

단방향 암호화는 주로 암호화 *해시 함수를 이용한 Hash 암호화 방식을 사용합니다.

※ 여기서 '해시함수'란? 어떤 크기의 입력 데이터를 넣어도 항상 동일한 크기의 데이터(해시 값 또는 해시 코드)로 반환 시켜주는 함수입니다.

 

지금부터 설명드릴 두 가지 방식은 모두 MessageDigest라는 클래스를 이용하여 암호화를 하는데요, 방식에 대해 설명드리기 전에 해당 클래스에 대한 설명을 먼저 드리자면

MessageDigest란?

자바에서 단방향 해시 함수 값을 구할 때 사용되는 클래스입니다.
비밀번호를 해시화하여 저장하고 싶을 때나 특정 정보를 암호화하고 싶을 때 주로 사용됩니다.

 

 

 

MD5(Message Digest 5)

- 128비트(16바이트)의 고정된 출력 값을 생성합니다.

- 현재는 보안 취약점으로 인해 사용이 권장되지 않는 해시 함수입니다.

md5.txt
0.00MB

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 문자) 길이의 해시 값을 생성합니다.

- 안전하고 강력한 알고리즘으로 암호학적으로 안전한 해시를 생성하기 때문에 비밀번호 보안, 데이터베이스 보안 등 다양하게 사용됩니다.

sha256.txt
0.00MB

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 해시 값을 반환합니다.

 

 

 

휴.. 갈 길이 머네요 😜😜

728x90