openssl version
OpenSSL 1.1.1f 31 Mar 2020
echo -n "Hello World!" | openssl dgst -sha256
(stdin)= 7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069
For SHA-256, the initial hash value, H(0), shall consist of the following eight 32-bit words, in hex:
= 6a09e667
= bb67ae85
= 3c6ef372
= a54ff53a
= 510e527f
= 9b05688c
= 1f83d9ab
= 5be0cd19
These words were obtained by taking the first thirty-two bits of the fractional parts of the square roots of the first eight prime numbers.
SHA-2는 length extension attack에 취약하기에, SHA-2로 비밀을 해시해서는 안된다.
이는 compression function을 반복적으로 호출하는 Merkle–Damgård construction의 단점 때문이다.
SHA-2는 입력과 digest 쌍으로부터 다른 입력과 digest를 계산할 수 있다.
즉, 공격자는 padding 부분이 입력의 일부인 것처럼 가장해서 Merkle–Damgård 계산한다면, 이전 해시를 이용하여 올바른 해시를 계산해낼 수 있게 된다.
SHA-256(secret || message || secret)
같은 방식의 대안이 있다.
🖇️cf. ||
는 문자열 연결 연산자이다.
이러한 이유로 SHA-2를 사용하려면 HMAC을 쓰고, SHA-3를 쓰려면 KMAC을 사용하자.