현재 개발 중인 프로젝트는 bearer 방식의 jwt + hash 비밀번호를 쓰려고 한다.
SHA-256에 대해 알아 보려고 한다.
java code 사용 할 경우.
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class main {
public static void main(String[] args) throws Exception {
System.out.println(sha256("needjarvis"));
}
/**
* SHA-256으로 해싱하는 메소드
*
* @param bytes
* @return
* @throws NoSuchAlgorithmException
*/
public static String sha256(String msg) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(msg.getBytes());
return bytesToHex1(md.digest());
}
/**
* 바이트를 헥스값으로 변환한다.
*
* @param bytes
* @return
*/
public static String bytesToHex(byte[] bytes) {
StringBuilder builder = new StringBuilder();
for (byte b: bytes) {
builder.append(String.format("%02x", b));
}
return builder.toString();
}
}
구현은 쉽다. 기존에 있는 라이브러리 쓰면 되니까.
왜 쓰는가 ?
2^256 만큼의 경우의 수가 존재하기 때문이다.
따라서 개인 컴퓨터로 무차별 대입 공격을 한다면, 많은 시간이 소요된다.
SHA-256 해시 함수는 어떤 길이의 값을 입력하더라도 256비트의 고정된 결과값을 출력한다.[2] 일반적으로 입력값이 조금만 변동하여도 출력값이 완전히 달라지기 때문에 출력값을 토대로 입력값을 유추하는 것은 거의 불가능하다. 아주 작은 확률로 입력값이 다름에도 불구하고 출력값이 같은 경우가 발생하는데 이것을 충돌이라고 한다. 이러한 충돌의 발생 확률이 낮을수록 좋은 함수라고 평가된다.
sha 256 과 512 의 차이는 다음과 같다.
그래서 우린 256으로 간다.
SHA-512로 서명 된 인증서는 Windows TLS 1.2에서는 작동하지 않는 점이 발견되었고,[7]길이 확장 공격에 대해 취약하며, SHA-256이 SHA-512보다 훨씬 빠르게 64개의 해시를 만들어낸다. 즉, 아직까지 SHA-512를 사용할 만큼의 문제점도 발견되지 않았다. 또한 현재에는 짧은 문자열(36 ~ 49 문자)이 사용되고 있고 긴 문자열(72 ~ 85 문자)에서도 큰 속도의 차이는 없기 때문에 상대적으로 속도적으로 느리며, 상대적으로 기술 비용이 많이 들어가는 SHA-512를 채택할 필요는 없다는 것이다.
'ALGORITHM' 카테고리의 다른 글
JAVA 미로탐색 / BFS (0) | 2022.06.14 |
---|---|
백준 2837 / java (0) | 2022.04.05 |
완전탐색 / 모의고사 (0) | 2022.03.23 |
Big O / 시간복잡도 / Binary Search / Linear Search (0) | 2022.03.20 |
백준 / greedy / 5585 / 거스름돈 (0) | 2022.03.14 |