misc.log

日常茶飯事とお仕事と

ハッシュ値を実際に作ってみる

宅ふぁいる便」というオージス総研がやっていたサービスで、480万件のアカウント情報が流出した件、パスワード情報が平文*1で保管されていたという件が盛り上がっています。

internet.watch.impress.co.jp

これで「パスワードが暗号化されていない」という話がチラホラ出てきていますが、実際のパスワードはこうしたシステムでは「ハッシュ化」という処置を施して保存するのが主流になっています。ハッシュ化は、暗号化と違って元に戻す(復号する)ということを想定せず、特定の計算処理で一定のデータ変換を行うというもの。情報自体は計算の過程で欠落したりするので元には戻せません。しかし、同じデータは同じ結果になるので、パスワードなどはこの状態に変換して保管しておき、パスワードを確認する際は、入力された文字列を変換して、あらかじめ保管しておいた変換済みのパスワードと比較します。

こうすることで、仮にパスワード情報が漏洩しても元に戻せないので、読めない。悪用できないというメリットが出てきます。

このハッシュという処理はいろんな方法があり、メリットやデメリット、すでに古くて使い物にならないものなどもあり、どれを選択するかといった事もシステム開発時のポイントとなります。

ちょっと仕事でこんな話をしたところ、どうもピンときていない人たちが多いようだったので簡単なハッシュ化のサンプルを作ってみました。

gitlab.com

たいした内容ではありません。.NET Frameworkが持っているハッシュ処理に文字列を通して結果を16進数表記で出しているだけ。SHA1などだとこんな感じ。

/// <summary>
/// SHA1を使ってハッシュを作成する。
/// </summary>
/// <param name="source">対象文字列。</param>
/// <returns>ハッシュデータ。</returns>
private string MakeHash_SHA1(string source)
{
    return BitConverter.ToString(new SHA1CryptoServiceProvider()
        .ComputeHash(Encoding.UTF8.GetBytes(source))).Replace("-", string.Empty);
}

ま、

  • どんな長さの文字列も決まった長さのデータに変換される。
  • 1文字でも違ったら全然違う結果になる。
  • 処理自体は案外簡単(1行で書こうと思えば書ける)。

といったあたりの説明用に利用しようかと。

以下、自分用メモとして参考にしたサイトを記載しておきます。

qiita.comstackoverflow.comarchive.codeplex.comcsharp.keicode.com

サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考

サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考

Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論と実際

Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論と実際

*1:平文: 暗号化など難読化されていないデータの状態。