SHA-1、SHA-256はGoの標準パッケージにも入っています。存在は知っていたものの得体が知れなくてスルーしていたのですが、セッションを理解する上で避けては通れなくなってしまったので調べてみました。
SHA-1、SHA-2、SHA-256とは
サーバ証明書が正規のものであるかをチェックする際に用いるハッシュ関数のことです。(7/17修正)
ハッシュ値を生成するハッシュ関数のことです。様々なことに利用されています。例えば任天堂のWiiでは起動時の署名にSHA-1が使われていたり、サーバ証明書が正規のものであるかをチェックする際に用いられたりもしています。(関連→SSLサーバ証明書がChromeで見れた!)
ちなみにハッシュ関数とは入力した値に対してアルゴリズムを実行し、異なる値を出力する関数のことです。
SHA-1、SHA-2、SHA-256の違い
Goの標準パッケージをみていて、「どうしてSHA-1ともうひとつが256??」とずっと謎でした。その謎がやっと解けました。
SHA-1とは
SHA-1とは、160ビットのハッシュ値を生成するハッシュ関数です。
詳細は以下です。
SHA-1はアメリカ国家安全保障局が考案し、1995年から米国政府の標準として使用されているハッシュ関数です。任意のデータから160ビットのハッシュ値を生成します。
SHA-1はこれまで広く使用されてきましたが、衝突に関する脆弱性が発見されたため、より安全なハッシュ関数を使うことが推奨されています。
2017年、GoogleがSHA-1でハッシュ値が衝突する事例を発見したため、SHA-1で暗号化されたデータであっても悪意のある第三者がすり替えて攻撃できることが明らかになりました。
SHA-2とは
224、256、384、512ビットのハッシュ値を生成する関数です。SHA-1よりセキュアとされています。
詳細は以下です。
SHA-224、SHA-256、SHA-384、SHA-512の4つのバリエーションが存在し、それぞれ224、256、384、512ビットのハッシュ値を生成することができます。SHA-1よりもビット数が多いため、より多くのハッシュ値を生成することができ、それだけ衝突の可能性が低くなります。
引用元:https://tech-camp.in/note/technology/44817/
つまりGoの標準パッケージに入っているSHA-256はSHA-2のうちの一つということです。よくGoのcryptoパッケージを見たらSHA-224、SHA-384、SHA-512も入っていました。
SHAで実際に暗号化させてみる
Goのcryptoパッケージを使って実際に「Hello World」を暗号化させてみたいと思います。
せっかくですので、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512の全種類で変換させてみます。
コードは以下です。
package main
import (
"crypto/sha1"
"crypto/sha256"
"crypto/sha512"
"fmt"
)
func main() {
package main
import (
"crypto/sha1"
"crypto/sha256"
"crypto/sha512"
"fmt"
)
func main() {
s := "Hello World"
b := []byte(s)
sha1 := sha1.Sum(b)
sha224 := sha256.Sum224(b)
sha256 := sha256.Sum256(b)
sha384 := sha512.Sum384(b)
sha512 := sha512.Sum512(b)
fmt.Println(sha1)
fmt.Println(sha224)
fmt.Println(sha256)
fmt.Println(sha384)
fmt.Println(sha512)
}
// 結果
// ==>[10 77 85 168 215 120 229 2 47 171 112 25 119 197 216 64 187 196 134 208]
// [196 137 15 175 253 176 16 93 153 26 70 30 102 142 39 102 133 64 27 2 234 177 239 67 114 121 80 71]
// [165 145 166 212 11 244 32 64 74 1 23 51 207 183 177 144 214 44 101 191 11 205 163 43 87 178 119 217 173 159 20 110]
// [153 81 67 41 24 107 47 106 228 161 50 158 126 230 198 16 167 41 99 99 53 23 74 198 183 64 249 2 131 150 252 200 3 208 233 56 99 167 195 217 15 134 190 238 120 47 79 63]
// [44 116 253 23 237 175 216 14 132 71 176 212 103 65 238 36 59 126 183 77 210 20 154 10 177 185 36 111 179 3 130 242 126 133 61 133 133 113 158 14 103 203 218 13 170 143 81 103 16 100 97 93 100 90 226 122 203 21 191 177 68 127 69 155]
こうみるとSHA-512の長さが際立っています。
次世代ハッシュ関数SHA-3
既に次世代ハッシュ関数のSHA-3が決まっています。SHA-3はSHA-1tpSHA-2とは異なる内部構造を持っており、セキュリティの向上が期待されています。
将来的にSHA-3に移行が進むとみられています。