HASH

소개

암호화가 다르게 복호화가 불가능하다

SHA256

Secure hash Algorithm 256-bit

  • 입력값이 아무리 길어도 256비트(32바이트) 고정된 길이 64자리 16진수 해시값으로 출력

작동 원리

  1. 입력값을 byte로 변환
  2. 512bit 단위로 쪼개고, 512bit보다 작을 경우 남은 부분은 Zero Padding
  3. 마지막 64번째 bit는 문자열의 길이 big endian 정수값으로 저장
  4. 처음 시작에 고정된 8개의 32bit값을 초기 해시값으로 사용
  5. 64번의 round 반복 작업
  6. 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
tsx
const 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^12
  • abcdefghijklmnopqrstuv : salt값. 128bit 값을 22자 base64로 인코딩
  • XYZ1234567890abcdefghi : 해시 값

예시 코드

  • 라이브러리 설치
groovy
implementation("org.springframework.security:spring-security-crypto")
java
public String encrypt(String message) { return BCrypt.hashpw(password, BCrypt.gensalt()); } public boolean check(String message, String encrypted) { return BCrypt.checkpw(message, encrypted); }