Digest 모듈

Digest 모듈

어떤 데이터가 주어졌을 때 그 데이터의 "지문"을 만들어 두고 싶을 때가 있어요. 파일이 중간에 바뀌지 않았는지, 비밀번호가 맞는지 확인할 때 말이죠. 이 Digest 모듈이 바로 메시지 다이제스트 라이브러리들을 위한 프레임워크를 제공해요.

참고: 더 다양한 알고리즘을 지원하는 OpenSSL::Digest를 함께 살펴보는 것도 좋아요.

암호 해시 함수(cryptographic hash function)는 데이터를 받아 고정 길이의 비트 문자열, 즉 해시 값을 돌려주는 절차예요. 이 해시 값을 digest라고도 불러요. 해시 함수를 일방향 함수(one-way function)라고 부르는 이유가 여기 있어요. 메시지에서 digest를 계산하는 건 쉬운데, digest에서 메시지를 되살려 내는 건 사실상 불가능하거든요.

예시

digestrequire하고 쓰면 됩니다. 가장 흔한 형태를 모아봤어요.

require 'digest'

# 한 번에 전체 digest 계산
Digest::SHA256.digest 'message'       #=> "\xABS\n\x13\xE4Y..."

sha256 = Digest::SHA256.new
sha256.digest 'message'               #=> "\xABS\n\x13\xE4Y..."

# 다른 인코딩 형식으로
Digest::SHA256.hexdigest 'message'    #=> "ab530a13e459..."
Digest::SHA256.base64digest 'message' #=> "q1MKE+RZFJgr..."

# 여러 조각으로 나눠서 계산
md5 = Digest::MD5.new
md5.update 'message1'
md5 << 'message2'                     # << 는 update 의 별칭

md5.hexdigest                         #=> "94af09c09bb9..."

# 파일의 digest 계산
sha256 = Digest::SHA256.file 'testfile'
sha256.hexdigest

추가로 digest는 "bubble babble" 형식으로도 인코딩할 수 있어요. 자음과 모음의 나열로 표현되어, 16진수 digest보다 사람이 알아보고 비교하기 쉬워요.

require 'digest/bubblebabble'

Digest::SHA256.bubblebabble 'message' #=> "xopoh-fedac-fenyh-..."

bubble babble 명세는 web.mit.edu/kenta/www/one/bubblebabble/spec/jrtrjwzi/draft-huima-01.txt에서 볼 수 있어요.

Digest 알고리즘

여러 digest 알고리즘(해시 함수)을 쓸 수 있어요:

  • MD5 — RFC 1321 The MD5 Message-Digest Algorithm 참고
  • RIPEMD-160Digest::RMD160로 사용. homes.esat.kuleuven.be/~bosselae/ripemd160.html 참고
  • SHA1 — FIPS 180 Secure Hash Standard 참고
  • SHA2 패밀리 — FIPS 180 Secure Hash Standard가 정의하는 SHA512, SHA384, SHA256
    • 최신 FIPS 문서는 csrc.nist.gov/publications/PubsFIPS.html에서 볼 수 있어요

상수

  • REQUIRE_MUTEX — Digest()를 위한 뮤텍스
  • VERSION — 버전 문자열

클래스 메서드

  • bubblebabble(string) → bubblebabble_string — 주어진 string의 BubbleBabble 인코딩 버전을 돌려줘요.

    # 내부 구현상 digest를 BubbleBabble 문자열로 변환
    
  • hexencode(string) → hexencoded_string — 주어진 string을 16진수로 인코딩한 버전을 만들어 줘요.

출처: Ruby 4.0 API - Digest