忍者ブログ

ひつ(じのひよこが)プログラミングします。
お仕事や趣味で困ったこととか、何度も「あれ?どうだったかしら」と調べたりしたこととか、作ったものとか、こどものこととかを書きます
★前は週末定期更新でしたが今は不定期更新です

2024/05    04« 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  »06

ハッシュ関数

ハッシュ関数

ハッシュ関数とは一定のデータを与えると以下の特徴を持つデータに変換してくれる関数。

  • 同一のデータを与えると何回やっても同一の値を出力する
  • 出力されたデータから元のデータを得ることは原則できない

例えばだが、一定のデータを与えると特定のデータに変換してくれる関数 (ハッシュ関数) の例として
任意のポケモンを与えるとそのタイプに変換してくれる関数が考えられる。
何度やってもピカチュウを与えるとでんきに変換してくれる。しかし、結果であるでんきから「元の値はピカチュウだ」と確定させることはできない。

暗号学的ハッシュ関数

暗号学的ハッシュ関数には先のハッシュ関数に加えて以下の特性が求められる。

  • 同一の出力が得られる入力が推測できない。
    上述の例は同一の出力であるでんきが得られる入力として同一の入力であるピカチュウ以外にマルマイン等がすぐに見つかるため、この特性を満たさない。
  • 出力から入力を推測できない。
    上述の例はでんきという出力からピカチュウかもしれないな、と推測ができるため、この特性を満たさない。
  • ランダムな入力を延々と試しても任意の出力を得ることが事実上できない。
    上述の例は高々802 (この記事を書いている時点 = ポケモン第七世代) 通りのポケモンを試せば絶対にでんきという出力が得られてしまうため、この特性を満たさない。

暗号学的ハッシュ関数として SHA-256 や SHA-512 などといったものが有名である。かつては SHA-1 や MD5 等があったが、これらは後に上述の特徴が失われた (弱点が見つかった) ため、もはや暗号学的ハッシュ関数としては使われない。この記事を書いている時点では暗号学的ハッシュ関数として扱われるハッシュ関数ももしかしたらもはや扱われなくなるかもしれない。


ハッシュ関数・暗号学的ハッシュ関数の用途

ハッシュ関数はデータの検索高速化に便利だ。例えばポケモンを検索するとしよう。何も考えずにピカチュウを検索するには 802 件のデータ全部を検索する必要がある。これに対して、「ピカチュウでんきタイプだから」とハッシュ値が「でんき」のポケモンだけを集めた一覧だけを検索したら検索すべきデータの数はかなり減る。

暗号学的ハッシュ関数は「元のデータは知られたくない/知りたくない/知らないけど元のデータと照合したい」といったわがままな要求への対処に有効だ。例えば、ユーザが入力したパスワードを暗号学的ハッシュ関数で変換して保存する。するとパスワードを保管している人は「出力から入力を推測できない」特性のためにユーザのパスワードを知ることがない。ユーザがパスワードをログインなどのために再度入力した際は入力をすぐに暗号学的ハッシュ関数にかけて、出力された値を先に保存した値と比較すればよい。
ただし、同じパスワードからは同じ値が出力される点には注意が必要だ。これを解決するための技術としてソルトなどがある。

PR

コメント

ただいまコメントを受けつけておりません。

ブログ内検索

P R