이번에는 암호화 및 복호화 모듈인 해시 함수에 대해 알아봅시다!
1. 해시 함수
해시 함수란? 입력 데이터를 고정 길이의 해시 값으로 변환하는 암호화 모듈입니다.
주로 데이터의 무결성을 확인하거나 비밀번호 저장, 디지털 서명 등에 사용됩니다.
해시 함수는 입력 데이터의 크기와 상관없이 항상 같은 길이의 해시 값만 생성하며, 해시 값에서 원래 데이터를 복원할 수 없어요..
해시 함수의 종류로는 다음과 같이 있습니다.
1-1. MD5(Message-Digest Algorithm)
MD5는 입력 데이터를 128bit(16byte)의 해시 값으로 변환합니다.
또한, 고정된 32자리의 16진수 문자열로 출력됩니다.
하지만, 현재는 보안 취약점으로 인해 비밀번호 저장 or 데이터 무결성 검증 등의 용도로는 사용을 피하는 것이 좋아요..
사용 방법은 다음과 같습니다. (java.security 패키지의 MessageDigest 클래스 사용)
MD5.java
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Example {
public static void main(String[] args) {
String input = "MD5 Test";
String md5Hash = getMD5Hash(input);
System.out.println("MD5 해시: " + md5Hash);
}
public static String getMD5Hash(String input) {
try {
// MessageDigest 인스턴스 생성
MessageDigest md = MessageDigest.getInstance("MD5");
// 입력 문자열의 바이트 배열 계산
byte[] messageDigest = md.digest(input.getBytes());
// 바이트 배열을 16진수 문자열로 변환
StringBuilder hexString = new StringBuilder();
for (byte b : messageDigest) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}
1-2. SHA-1(Secure Hash Algorithm 1)
SHA-1은 암호학적 해시 함수로 1995년에 발표되었습니다.
주로 데이터의 무결성을 검증하는 데 사용되며, 160bit(20byte)의 해시 값을 생성합니다.
또한, 입력 데이터가 조금만 변경되어도 완전히 다른 해시 값을 생성하는 특성을 가지고 있어요.
하지만, 현재는 여러 가지 보안 취약점이 발견되어 사용하지 않는 것을 권장하고 있어요.
사용 방법은 다음과 같습니다. (java.security 패키지의 MessageDigest 클래스 사용)
SHA-1.java
import java.security.MessageDigest;
public class SHA1Example {
public static void main(String[] args) {
try {
// 해시할 데이터
String data = "SHA-1 Test";
// SHA-1 해시 객체 생성
MessageDigest md = MessageDigest.getInstance("SHA-1");
// 데이터 업데이트
md.update(data.getBytes("UTF-8"));
// 해시 값 생성
byte[] hashBytes = md.digest();
// 해시 값을 16진수로 변환
StringBuilder hexString = new StringBuilder();
for (byte b : hashBytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
// 결과 출력
System.out.println("SHA-1 해시 값: " + hexString.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
1-3. SHA-2(Secure Hash Algorithm 2)
SHA-2는 SHA-1의 후속 해시 알고리즘으로, 더 높은 보안성을 제공합니다.
일반적인 SHA-2는 SHA-256과 SHA-512입니다. 이들은 각각 256bit와 512bit의 해시 값을 생성해요.
사용 방법은 다음과 같습니다. (java.security 패키지의 MessageDigest 클래스 사용)
SHA-256.java
import java.security.MessageDigest;
public class SHA256Example {
public static void main(String[] args) {
try {
// 해시할 데이터
String data = "SHA-256 Test";
// SHA-256 해시 객체 생성
MessageDigest md = MessageDigest.getInstance("SHA-256");
// 데이터 업데이트
md.update(data.getBytes("UTF-8"));
// 해시 값 생성
byte[] hashBytes = md.digest();
// 해시 값을 16진수로 변환
StringBuilder hexString = new StringBuilder();
for (byte b : hashBytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
// 결과 출력
System.out.println("SHA-256 해시 값: " + hexString.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
SHA-512.java
import java.security.MessageDigest;
public class SHA512Example {
public static void main(String[] args) {
try {
// 해시할 데이터
String data = "SHA-512 Test";
// SHA-512 해시 객체 생성
MessageDigest md = MessageDigest.getInstance("SHA-512");
// 데이터 업데이트
md.update(data.getBytes("UTF-8"));
// 해시 값 생성
byte[] hashBytes = md.digest();
// 해시 값을 16진수로 변환
StringBuilder hexString = new StringBuilder();
for (byte b : hashBytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
// 결과 출력
System.out.println("SHA-512 해시 값: " + hexString.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
1-4. SHA-3(Secure Hash Algorithm 3)
SHA-3는 SHA-2의 후속으로, Keccak 알고리즘을 기반으로 한 새로운 해시 함수입니다.
이는 SHA-2와는 다른 구조와 보안성을 가지고 있으며, 다양한 해시 길이(224, 256, 384, 512bit)를 지원합니다.
또한, 암호화, 데이터 무결성 검증 등 다양한 분야에서 사용할 수 있어요.
사용 방법은 다음과 같습니다. (java.security 패키지의 MessageDigest 클래스 사용)
SHA-3-256.java
import java.security.MessageDigest;
public class SHA3Example {
public static void main(String[] args) {
try {
// 해시할 데이터
String data = "SHA-3-256 Test";
// SHA-3-256 해시 객체 생성
MessageDigest md = MessageDigest.getInstance("SHA3-256");
// 데이터 업데이트
md.update(data.getBytes("UTF-8"));
// 해시 값 생성
byte[] hashBytes = md.digest();
// 해시 값을 16진수로 변환
StringBuilder hexString = new StringBuilder();
for (byte b : hashBytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
// 결과 출력
System.out.println("SHA3-256 해시 값: " + hexString.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
SHA-3-512.java
import java.security.MessageDigest;
public class SHA3Example {
public static void main(String[] args) {
try {
// 해시할 데이터
String data = "SHA-3-512 Test";
// SHA-3-512 해시 객체 생성
MessageDigest md = MessageDigest.getInstance("SHA3-512");
// 데이터 업데이트
md.update(data.getBytes("UTF-8"));
// 해시 값 생성
byte[] hashBytes = md.digest();
// 해시 값을 16진수로 변환
StringBuilder hexString = new StringBuilder();
for (byte b : hashBytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
// 결과 출력
System.out.println("SHA3-512 해시 값: " + hexString.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. 정리하며
지금까지 해시 함수에 대해 알아보았습니다.
이를 활용하여, 평문을 암호화, 비밀번호 저장, 디지털 서명 등에 사용할 수 있을 것 같아요.
참고
'Programming Language > Java' 카테고리의 다른 글
LocalDateTime - 날짜 및 시간을 다루는 클래스 (1) | 2024.09.26 |
---|---|
암호화 및 복호화 모듈 - 비대칭 키 암호화 (2) | 2024.09.04 |
AES를 활용해 암호화 및 복호화하기 (0) | 2024.09.03 |
암호화 및 복호화 모듈 - 대칭 키 암호화 (0) | 2024.09.03 |
try-with-resources (0) | 2024.08.02 |