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 μΈμ¦μ„œ 정보에도 μ„œλͺ… ν•΄μ‹œ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œλ„ μ‚¬μš©ν•˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.