SHA-256

SHA

SHA(Secure Hash Algorithm)은 NIST에 의해서 관리되는 안전한 해시 표준 함수들의 모음이며 현재는 NIST FIPS 180-3 규격의 SHA-2를 권장해서 사용하고 있습니다. 해시 함수는 어떠한 문자열을 일정한 길이를 가진 임의의 문자열로 변환하는 것을 말합니다. 수 많은 연구에 의해 만들어진 여러가지 해시 함수 중에서 일반적으로 SHA-256을 사용하는 이유는 해시 함수를 사용하게 되는 목적에 있다고 볼 수 있습니다. 특정한 문자열에 대해서는 동일한 해시값(다이제스트)으로 변환되며 해시값을 기준으로는 동일한 패턴을 찾을 수 없어서 본래의 문자열을 유추할 수 없도록 하고자 하는 것에 있습니다.

SHA-256 해시 함수의 동작 과정은 Sha256 Algorithm Explained를 이용하면 눈으로 확인할 수 있으니 참고해보면 좋을 것 같습니다.

메시지 다이제스트

해시 함수는 어떠한 입력에 대해서 일정한 길이의 비트로 이루어진 결과를 가져오기 위한 목적으로 사용됩니다. 메시지 다이제스트란 어떤 문자열 데이터를 일정한 길이의 다이제스트로 변환한 것을 말하며 단순하게 해시 함수로 처리된 해시값일 뿐입니다.

package main

import (
	"crypto/sha256"
	"encoding/hex"
	"fmt"
)

func main() {
	plain := "HelloWorld"
	hash := sha256.New()
	hash.Write([]byte(plain))
	hashed := hash.Sum(nil)
	fmt.Println("plain:", plain)
	fmt.Println("hashed:", hex.EncodeToString(hashed))
}
plain: HelloWorld
hashed: 872e4e50ce9990d8b041330c47c9ddd11bec6b503ae9386a99da8584e9bb12c4

파일 체크섬

위 메시지 다이제스트를 바이너리 파일에 활용한 부분이 파일 체크섬입니다. how-to-verify-ubuntu에서 처럼 다운로드 받은 파일의 위변조 여부를 검증하기 위해서 MD5 또는 SHA-256로 해시된 다이제스트를 제공하며 이를 통해 올바른 바이너리 파일임을 검증하고 안전하다고 판단할 수 있습니다. 아래의 예시는 윈도우 터미널에서 CertUtil을 사용하여 파일 체크섬을 확인한 것이며 GtkHash와 같은 도구로도 확인할 수 있습니다.

PS C:\> certutil -hashfile orig.txt sha256
SHA256의 orig.txt 해시:
872e4e50ce9990d8b041330c47c9ddd11bec6b503ae9386a99da8584e9bb12c4
CertUtil: -hashfile 명령이 성공적으로 완료되었습니다.

비밀번호 암호화

일반적으로 비밀번호를 암호화하여 저장할 때는 안전한 패스워드 저장에서 언급된 PBKDF2 또는 bcrypt를 사용하는 편인 것으로 알고 있습니다. bcrypt는 NIST 에서 권장하는 알고리즘에 속하지는 않았으나 OpenBSD나 스프링 프레임워크의 기본 패스워드 인코더로 지정된 비교적 안전한 알고리즘 중 하나입니다. 아무튼 시계열 데이터베이스 중 하나인 KDB+는 MD5 또는 SHA-1 알고리즘 방식으로 비밀번호를 지원하기에 사용하는 시스템마다 지원하는 방식에 제한이 있을 수 있습니다.

비밀번호 암호화 관련 읽으면 좋은 글

키 서명 지문

SSH 키 페어 발급 및 원격 호스트 연결하기에서처럼 SSH 키에 대해 지문(Fingerprint)을 생성해놓고 호스트에 대한 공개키가 변경되었는지를 판단하는데 사용되기도 합니다. 이러한 키 서명 지문은 아래의 이미지와 같이 SSL 인증서 정보에도 서명 해시 알고리즘으로도 사용하는 것을 확인할 수 있습니다.