Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Postman
- 오블완
- java
- JPA
- 파이썬
- 롬복
- GitHub
- Spring Boot
- Git
- 알고리즘
- golang
- mariadb
- 기초100제
- 클린코드
- Gradle
- 티스토리챌린지
- spring security
- go
- MySQL
- 코드업
- H2 설치
- Spring
- springboot
- 스프링
- Python
- thymeleaf
- Codeup
- 객사오
- Vue.js
- 클린 코드
Archives
- Today
- Total
nyximos.log
단방향 암호화 알고리즘 - MD5, SHA-256 본문
암호화 : 해시, 서명등을 이용해 정보를 보호하는 방식
단방향 암호화
- 대부분 Hash 알고리즘을 이용해 구현한다.
- 빠른 성능
- 민감한 정보를 데이터베이스에 저장할때 사용한다.
- 복호화하지 않을 때 사용
해시 알고리즘
- 해시가 느리고 길수록 신뢰도가 올라간다.
- 임의의 크기를 가진 데이터 key를 고정된 데이터의 크기로 변환시키는 알고리즘
- 키값을 해시 함수 수식에 대입시켜 계산 후 나온 결과를 주소로 사용하여 값에 접근한다.
MD5 (Message Digest Algorithm 5)
- 출력 크기: 128비트 (16바이트), 가장 짧고 빠르다.
- 보안: 충돌이 발생하기 쉬워 보안이 취약하다.
- 사용 예: 데이터 무결성 검증, 체크섬 계산 등 (보안이 중요하지 않은 경우)
SHA-256 (Secure Hash Algorithm 256-bit)
- 출력 크기: 256비트 (32바이트), 가장 긴 해시를 생성한다.
- 보안: MD5보다 훨씬 강력한 보안성을 제공. 현재까지는 안전한 알고리즘으로 간주한다.
- 보안이 중요한 경우, 데이터 무결성 검증, 디지털 서명, 인증서 등에 사용한다.
- 속도: MD5보다 느림
Java의 MessageDigest
JDK 9부터는 내장된 SHA3-256 알고리즘을 간단히 사용할 수 있다.
final MessageDigest digest = MessageDigest.getInstance("SHA3-256");
final byte[] hashbytes = digest.digest(
originalString.getBytes(StandardCharsets.UTF_8));
String sha3Hex = bytesToHex(hashbytes);
Rainbow Table
해시 함수를 사용하여 변환 가능한 모든 해시값을 저장해둔 표
해시된 비밀번호가 유출될 경우 Rainbow Table을 이용해 비밀번호를 복구 할 수 있다.
Salt
해시 알고리즘에서 보안성을 강화하기 위해 사용되는 추가 데이터
고유한 무작위 데이터를 추가하여 해시값을 생성한다.
따라서 같은 비밀번호라도 다른 해시값이 생성된다.
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;
public class EncryptUtils {
public static String generateSalt() {
SecureRandom random = new SecureRandom();
byte[] salt = new byte[16];
random.nextBytes(salt); // 배열에 랜덤한 바이트 값 채우기
return Base64.getEncoder().encodeToString(salt); // Base64로 인코딩해서 문자열로 변환
}
public static String encryptSHA256WithSalt(String input, String salt) {
StringBuilder sb = new StringBuilder();
String saltedInput = sb.append(input).append(salt).toString(); // saltedInput 문자열을 생성
try {
// SHA3-256 해시를 계산하여 바이트 배열로 반환
MessageDigest digest = MessageDigest.getInstance("SHA3-256");
byte[] hash = digest.digest(saltedInput.getBytes());
return byteToHex(hash);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
// 바이트 배열을 16진수 문자열로 변환
private static String byteToHex(byte[] bytes) {
StringBuilder hexString = new StringBuilder();
for (byte b : bytes) {
String hex = String.format("%02x", b);
hexString.append(hex);
}
return hexString.toString();
}
}