소개
암호화가 다르게 복호화가 불가능하다
SHA256
Secure hash Algorithm 256-bit
- 입력값이 아무리 길어도 256비트(32바이트) 고정된 길이 64자리 16진수 해시값으로 출력
작동 원리
- 입력값을 byte로 변환
- 512bit 단위로 쪼개고, 512bit보다 작을 경우 남은 부분은 Zero Padding
- 마지막 64번째 bit는 문자열의 길이 big endian 정수값으로 저장
- 처음 시작에 고정된 8개의 32bit값을 초기 해시값으로 사용
- 64번의 round 반복 작업
- 64자리 16진수 값으로 결과물 출력
예시 코드
- Java
java/** * 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()); byte[] bytes = md.digest()); StringBuilder builder = new StringBuilder(); for (byte b: bytes) { builder.append(String.format("%02x", b)); } return builder.toString(); }
- Typescript
tsxconst hashString = async (text: string) => { const encoder = new TextEncoder(); const data = encoder.encode(text); const hashBuffer = await crypto.subtle.digest(algorithm, data); return Array.from(new Uint8Array(hashBuffer)) .map((b) => b.toString(16).padStart(2, "0")) .join(""); };
Bcrypt
- salt를 포함하고, 설정에 따라 느린 계산을 만들면서 brute-force 공격을 방어할 수 있다
결과 예시
$2b$12$abcdefghijklmnopqrstuvXYZ1234567890abcdefghi
$2b$: 알고리즘 식별자12$: 반복 횟수. 2^12abcdefghijklmnopqrstuv: salt값. 128bit 값을 22자 base64로 인코딩XYZ1234567890abcdefghi: 해시 값
예시 코드
- 라이브러리 설치
groovyimplementation("org.springframework.security:spring-security-crypto")
javapublic String encrypt(String message) { return BCrypt.hashpw(password, BCrypt.gensalt()); } public boolean check(String message, String encrypted) { return BCrypt.checkpw(message, encrypted); }