同じアルゴリズムである限り、どんなツールを使っても、同じ入力に対しては同じハッシュ値が返ります。パスワードなどを平文ではなくハッシュ値で保存しておいて、画面入力時にハッシュ値を計算した結果と比較して、一致判断ができるわけですね。レインボー攻撃(レインボーテーブル)計算されたハッシュ値から元の値を復元するのは、まあ・・不可能です。同じ入力で、同じアルゴリズムなら、同じハッシュ値が常に求められるというのを逆手にとった攻撃手段でハッシュ値の元になった平文を推測することは可能です。やり方はシンプルです。事前に、様々な平文をハッシュ関数に通してハッシュ値を計算して、そのハッシュ値をキーにして平文を返す逆引きテーブルみたいなものを用意すれば良いわけです。いう逆引きテーブルを「レインボーテーブル」と言い、それを使って、例えばパスワードをハッキングする攻撃(実際はもう少し複雑ですが)を「レインボーテーブル攻撃」と言います。persol-tech-s.co.jpこの攻撃は、ある程度、事前に現れるであろう平文のパターンとアルゴリズムの組合せが予測できていないといけません。上記の記事では今時「password」「abcdefg」「qwerty」などという単純すぎるパスワードは使っている人はいないと思うので(いませんよね?)、と書かれていて、なおかつレインボーテーブル攻撃が実際に使われることはほとんどありません。「ハッシュ関数を多重化する」「ソルト(パスワードにキーワードを追加してからハッシュ関数にかける)」という方法で、レインボーテーブル攻撃を予防できるからです。自分もそのはずだ・・と思っていますが、どうも、現実はそうでないみたいです。以下の記事によると、そういう単純すぎるパスワードを平気で使って、ハッキング被害にあっている人が千万人単位でいるみたいですからね。10mtv.jpなんともはや・・ですね。暗号学的ハッシュで使う「ソルト」のイメージ入力となる元文字列に少し手を加えるだけで、ハッシュ値は全く違うものになります。それをうまく使えば、レインボー攻撃を防ぐこともできます。どんな感じか、やってみます。最悪のパスワードランキングの絶対王者(笑)「123456」をMD5でハッシュ値をもとめてみます。hashlib.md5()m.update(b"123456")print(m.hexdigest())求められたハッシュ値は。e10adc3949ba59abbe56e057f20f883eです。これに「a」を一文字足してみます。m.update(b"a123456")これだけで、生成されるハッシュ値は以下のように変わります。dc483e80a7a0bd9ef71d8cf973673924全然違います。元のハッシュ値から推測できるような規則性もありません。こんな風に付け加えるランダムなデータ(上記例だとa)を「ソルト」と呼びます。ja.wikipedia.org実際には、「a」みたいな短いソルトは意味をなしません。短いソルト、予測しやすい単純なパスワードであれば、事前にそれの組合せでハッシュ値をもとめておくことは容易にできますから。上記は、あくまで考え方の例にすぎません。適切なパスワードと、ある程度の長さを持つランダムなソルトを使うことが、大前提ではあります。ハッシュ関数を多重化するということハッシュ関数を多重化するのもセキュリティ強度向上に有効な手として知られてます。やり方は色々あります。あるアルゴリズムで求めたハッシュ値を、他のアルゴリズムのインプットにして二重・三重にハッシュ関数を通しておくとか。MD5とSHA1みたいな)でハッシュ値を求めて、両方共一致したらOKとする・・みたいな多重化とか。一度求めたハッシュ値を、ソルトに使って、別のアルゴリズムで再度ハッシュ値を求めるとかですね。・・ということで、自分が知っている「一度求めたハッシュ値を、ソルトに使って」の例をひとつあげてみます。これは、アウトプット長を指定できるBreak2b、Break2sなどを使って求めたハッシュ値をソルトに使う例になります。Break2bも、hashlibにあるので、以下のようにして使えます。b2b.hexdigest()print(salt)print(len(salt))Break2bは、アウトプットサイズをバイト単位で指定できます。上記例だと「5バイト」指定なので、出力を16進数(4ビット単位)に変換すると、長さは「10」になります。b93425040010こうして求める短いハッシュ値をソルトに使うわけです。イメージとしては、こんな感じですかね。"123456"sha256.update(text.encode())print(sha256.hexdigest())Break2bで求めたハッシュ値を一度Hexの文字列にして、テキストに連結してから、Byte列に戻して、アウトプットのハッシュ値を計算しています。数学的に考察したとかもなく、単純に固定のソルトをどっかに埋め込んでおくよりははマシだろう的な発想です。こんなやり方もアリかな?・・的な一つの例でしかありません。あしからず(笑)ハッシュ関数のアルゴリズムを強度の高いものにするのは基本中の基本ですあと。あたりまえですけど、ハッシュ関数のアルゴリズム自体も、できるだけ強度の高いものを選んでおくほうが安心です。MD5やSHA1については、限界や脆弱性が指摘されています。www.ipa.go.jpwww.jpcert.or.jp実際のところ。そんな脆弱性をつかれて自分のところが攻撃にやられる・・なんて確率は低いです。後付けでブーブー言われないよう、時点で問題ないと言われているアルゴリズムを選択しておいた方が良いと思います。pythonなら、アルゴリズムの変更は簡単ですしね。上記のMD5の例を安全と言われるSHA256に変更するなら。」に変更するだけです。これで結果は20f645c703944a0027acf6fad92ec465247842450605c5406b50676ff0dcd5eaに変わります。これだけで、脆弱性のあるアルゴリズムを使ったなどと、なんかあった時につつかれる可能性のある弱みが減らせるなら、やらない手はないと思ってます。現実的にそこまでの強度が必要な場合ばかりじゃない直前までの話から、ちょっと方向が変わりますが、おまけです。ハッシュの用途は様々なので、そこまでの強度が必要ない場合もままあります。内容的に価値の大したことの無い情報だけど、いちおう、改ざんチェック用にハッシュ値を持っておかないといけない・・みたいな時などです。そんな時にがっつり本格的な「暗号学的ハッシュアルゴリズム」を使うのは、ちょっと重たいです。軽量で高速なアルゴリズムでもいいかな・・なんて思うわけです。そんな時に使えるシンプルなアルゴリズムがあります。Vo)の名前をつなげただけの「非暗号化ハッシュ関数」です。上記の記事を読めばわかりますが、とにかくシンプルです。実際、記事の中に、疑似コードが書いてあって、ほぼ、それで実装できたりします。試しにやってみると、こんな感じ。hex(hash)[2:]この2つの関数は以下のように使います。world'))これの結果です。779a65e7023cd2e7d58b3fa7こういうのは。無理に使うようなものではありません。引き出しにしまってある知識のひとつとして「こんなのもあるよ」って持っていても、悪くはないかな・・とも思ってます。今回は、こんなものですかね。検索スポンサーリンク最近のアクセスTOP5ブクマ数TOP3IT的なTIPS・ノウハウイベントログから抽出したログオン・オフ時刻を見やすいように整形するEXCELのVBAマクロなど。Google検索は利用するけど、アクティビティを保存させたくない時もある文字コードで悩まされるなんて久しぶり/JIS7(ISO-2022-JP)とJIS8の話もっと見る作業時によく参照する「まとめ」djangoテンプレート内でforループで回す時の整理とデフォルト辞書利用時の注意など。djangoテンプレート内ので条件分岐(IF文)で注意することなどをまとめておくdjangoテンプレート/変数の値の参照の仕方が、Pythonと違う所があるので整理しておく。service」とサーバーレスコンピューティング関係をまとめてみる。PWA・SPA・・など「最近のWEBアプリケーションの種類」をざっくりまとめる。文系的まとめディープラーニング(ニューラルネットワーク)の「学習」の肝は「微分」らしいよ。Consoleもっと見るディープラーニングのデモをやってみるWord2Vecで「単語の足し算・引き算の結果(単語)を取得する」デモをやってみる。API」で入力文の疑わしい部分をAIが指摘するデモを作る。classで事前学習済のVGG16モデルを使った画像識別クラス/tensorflow2.0(tf.keras)ランダムフォレストで回帰してみる/気象情報と電力データその2もっと見るPythonでWebアプリやってみるviews.py(python)からデータを渡して、Chart.jsでRaderチャートを描く/Chart.js+djangoWEBブラウザ上にドラッグ&ドロップした画像ファイルをBase64に変換して表示するWEBブラウザで手描きしたイメージをJPEG・PNG変換後Base64エンコードするもっと見るPythonで自動化やってみるWebアプリケーションで自動的に値を参照、スクロール他Tips/Selenium&pythonWebアプリケーションで自動的に何かをクリックするTips/Selenium&pythonWebアプリケーションへの自動入力・選択のTipsあれこれ/Selenium&pythonもっと見るPythonで数学・グラフィックスやってみるモンティ・ホール問題で、ちょっと暇つぶし。最近、台風が怖すぎる!!!生産性向上しろと言いながら、片方で足をひっぱるなんて・・と呆れてます。/軽減税率のニュースを見てもっと見るBOKU62歳の文系SE”BOKU”です。<arakan_no_boku@yahoo.co.jp>興味の向いたものを、つまみ食い的に勉強してます。自分が消化した内容を、頭の整理と備忘を兼ねてブログに書いてます。IT系・・特に機械学習・プログラムネタが中心ですが、IT以外のネタになる時もあります。(43)スポンサーリンクはてなブログをはじめよう!arakan_no_bokuさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。