ハッシュ(hash)
ハッシュ値そのもの、またはハッシュ値を求めること。ハッシュ化、ハッシュ関数など様々な呼ばれ方をする。ざっくりいうと、ある入力を与えるとある出力が返ってくる、同じ入力を与えると必ず同じ出力が返ってくる、逆方向の計算が難しい、というような性質を持つ。
# ハッシュ化の例
hash('こんにちは。') -> 'foa528nsfg989eyj'
プログラミング言語によってはハッシュと呼ばれるデータ構造を持つものがあるが、これは似ているけど違うもの(であることが多い)。
暗号学的ハッシュ関数
ハッシュ関数のうち、ハッシュ値から入力を求めることが不可能、同じハッシュ値となるような異なる2つの入力を求めることが不可能、というような性質を満たしたものを暗号学的ハッシュ関数と呼ぶ。(とても簡略化した説明)
この場合の不可能とは、「現実的な時間内におさまらない」というような意味。
md5
ハッシュ化のアルゴリズムの一つ。同一のハッシュ値になる異なる入力を求めることが可能なため、現在は暗号化に利用することは危険。
sha1
ハッシュ化のアルゴリズムの一つ。こちらもmd5と同様の理由で暗号化へ利用することは危険。
sha2
ハッシュ化のアルゴリズムの一つ。sha1を改良し、出力されるハッシュ値の長さを長くしたもの。
ダイジェスト(digest)
ハッシュとほぼ同じ意味。
メッセージダイジェスト
ダイジェストとほぼ同じ意味だが、「送受信されたデータの内容を保証するために、事前にハッシュ値を求めておき、後で比較検証できるようにする」というようなニュアンスが加わると、ハッシュではなく(メッセージ)ダイジェストと呼ばれたりする。
Rubyだとhmacを実現するメソッド名になっている。
hmac
電子署名の方式の一つ。ざっくりいうと鍵付きのハッシュ。
秘密鍵とハッシュ関数を組み合わせる手法によっては、セキュリティホールが発生する可能性がある。このようなセキュリティホールがないことが証明されている組み合わせ手法のことをhmacと呼ぶ。
# あまりよろしくないパスワード(≒秘密鍵)の使い方の例
hash('こんにちは。' + 'パスワード') -> 'foa528nsfg989eyj'
# よい使い方の例(hmacの実装は言語依存)
hmac('こんにちは', 'パスワード') -> 'foa528nsfg989eyj'
電子署名とhmacの違い
両方とも文章の改ざんを検出するために用いられるという点は同じで、鍵の取り扱いが異なる。
公開鍵暗号方式を用いるのが電子署名。本人しか持っていない秘密鍵を用いて署名し、公開されている公開鍵で誰でも検証できる。それに対して、hmacでは共通の秘密鍵を用いる。
秘密鍵と公開鍵の関係
秘密鍵から公開鍵を作成することは簡単にできる。その逆はとてもむずかしい。
公開鍵暗号
自分しか持っていない秘密鍵と全体に公開された公開鍵を用いた暗号化の総称。
共通鍵暗号
自分と相手の両方が持っている秘密鍵を用いた暗号化の総称。
電子署名
改ざんやなりすましを防ぐために利用する技術の総称。
電子署名と暗号
何かしらの鍵を使って入力されたデータを別の形式に変換するという意味では同じ。電子署名と言った場合、誰でも中身を見ることができる。暗号と言った場合、中身は鍵を持つ人しか見ることができない。
RSA暗号
公開鍵暗号を利用した暗号化方式の一つ。
DES暗号
暗号化の規格、または、その規格を満たすアルゴリズムのこと。標準としてのDESとアルゴリズムを区別する場合は、アルゴリズムをDEAと呼ぶ。
楕円曲線暗号
楕円曲線を利用した暗号方式の総称。公開鍵暗号方式を利用したものが多い。