目次
ハッシュについて
元データに対して後述するアルゴリズムを使って、単体では意味のわからないデータに変換すること。ハッシュ化されたデータは元には戻せない。
データ改ざんやファイルが正しく送信できているかのチェック(チェックサム)や、パスワード保存時などに使われる。
ハッシュ化のアルゴリズム
- MD5(Message Digest Algorithm 5)
- 128ビットの適当なハッシュ値を作成
- 作成されたハッシュから元データを求めることができた報告があるなど脆弱性があるので、非推奨
- SHA-1(Secure Hash Algorithm 1)
- 160ビットの適当なハッシュ値を作成
- こちらも同じく脆弱性があるので、非推奨
- SHA-2(Secure Hash Algorithm 2)
- SHA-224、SHA-256、SHA-384、SHA-512の4種類
- 最長のSHA-512が安全性が高く、SHA-256が最もよく利用されている
- SHA-3(Secure Hash Algorithm 3)
- SHA-2の後継
- Keccak(ケチャック)と呼ばれるハッシュ関数でSHA-3として採用された
ソルトを使ったセキュリティ強化
何らかの原因でハッシュ化されたパスワード一覧が流失してしまうケースを考えます。SHA-256などの一般的によく使われるアルゴリズムでそのパスワード一覧ハッシュ化すると、突破されてしまいます。
これに対する対策として、ソルトと呼ばれるランダムなデータを元データに追加した上でハッシュ化します。
ソルトは
- ソルトに固定値を使う
- 桁数固定(できれば32byte or 64byte)のランダムなソルトを使う
の2通りはあり、ランダムなソルトを使う場合はDBにもソルトを保存しておく必要がある。
例:
平文パスワード:password
ソルト:random_salt_string
ハッシュ化対象の値:random_salt_stringpassword
ハッシュ値(SHA-256):BD294F9FFC10B8A7F1AB6A1DB399CDCAA76DCEDE0CC0129510D60D526722A595
DBに保存する値:random_salt_string:BD294F9FFC10B8A7F1AB6A1DB399CDCAA76DCEDE0CC0129510D60D526722A595
ハッシュ化の実装
ハッシュ計算をする関数
private fun calculateHash(input: String, algorithm: String): String {
// MD5ハッシュ計算
val byteArray = MessageDigest.getInstance(algorithm).digest(input.toByteArray(UTF_8))
// バイト配列を16進数の文字列に変換
return byteArray.joinToString(separator = "") { byte -> "%02x".format(byte) }
}
MD5
calculateHash(input = input, algorithm = "MD5")
SHA-256
calculateHash(input = input, algorithm = "SHA-256")
この記事へのコメントはありません。