パスワードクラック概論(3)
「平文で正しいパスワードを保存すると『パスワードデータファイルを抜かれる』が即『全てのアカウントを破られる』に繋がってしまう、そこで正しいパスワードを暗号化した上で保存しておく」。自然な発想ですね。今回から少しずつ話が不自然になっていきます(例えばコンテンツ中の「暗号」という言葉が、日常生活で用いる「暗号」という言葉から離れていきます)。
さて、何故パスワードに対する暗号化処理を行っているにも関わらず「パスワードクラック」の可能性を完全に塞ぐことができないのか。その主な原因は
仮に、それぞれのアカウントに関するパスワードが全て別の関数に代入されていたら。「パスワードデータファイル」を抜かれたとしてもどうってことはありません。
勿論そんなことは現実的に不可能です(アカウントが数個なら可能かもしれませんが)。しかしそれを簡易的に実現する方法はある。「関数」に対する入力を複数にすれば良い。
y:パスワードデータファイルに保存する文字列
x:(生の)パスワード
a:アカウント
y:パスワードデータファイルに保存する文字列
x:(生の)パスワード
b:ユーザーが決めた秘密の数字
このように、ある文字列(この場合はパスワード)に対する暗号化を行うために用いられるそれ以外の文字列(例1では「アカウント」で例2では「ユーザーが決めた秘密の数字」)を「鍵」と言います。
「複数入力&一出力」の関数で暗号化を行えば「『一つの入力と一つの出力を複数通り抜かれる』が『関数の実体を推測される』」に繋がることはなくなる。xとyが分かってもaが分からなければ関数を推測されることはないしyからxを求められることもない。「アカウント」はクラッカーから見えますが、「それがパスワード暗号化関数への入力に使われている」というコトは見えにくいでしょう。「入力」を複数にすれば関数の実体は推測されにくくなる。
勿論、「鍵(=暗号化関数に対するパスワード以外の入力)がアカウントである」というコトがバレてしまえばパスワードクラック概論(2)と同じ方法で「yamadaの正しいパスワード」の解読を試みられるでしょう。
x=(y-a)/3 ←上記□例1の関数を「x=〜」の形に直した式
関数の実体さえ分かれば逆関数を求めることは可能ですからね。
□例1と同様に「関数の実体は推測されにくく」なりますし、また仮に推測されたところで「ターゲットyamadaに関するb」がバレなければ「yamadaの正しいパスワード」は推測されない。
勿論、関数の実体を推測された上で更に「鍵(=yamadaの秘密の数字)」がバレてしまえばパスワードクラック概論(2)と同じ方法で「yamadaの正しいパスワード」の解読を試みられるでしょう。
x=(y-b)/3 ←上記□例2の関数を「x=〜」の形に直した式
関数の実体さえ分かれば逆関数を求めることは可能ですからね。
さて、何故パスワードに対する暗号化処理を行っているにも関わらず「パスワードクラック」の可能性を完全に塞ぐことができないのか。その主な原因は
全てのアカウントに関するパスワードが同じ関数に代入されている
ということです。
(前略)
yamada,JUhbgfd4E ←ターゲットyamadaのパスワードをある関数に代入した結果
(中略)
test1,edCf1ygh ←自分のアカウント1のパスワード1を同じ関数に代入した結果
test2,Lp8hGvdS ←自分のアカウント2のパスワード2を同じ関数に代入した結果
(後略)
「全てのアカウントに関するパスワードが同じ関数に代入されている」からこそ、(パスワードデータファイルを抜く方法を発見した)クラッカーには様々な「入力(自分が設定したパスワード)」と「それに対する出力(パスワードデータファイル内の文字列)」から「関数」の実体を推測することが可能になる。yamada,JUhbgfd4E ←ターゲットyamadaのパスワードをある関数に代入した結果
(中略)
test1,edCf1ygh ←自分のアカウント1のパスワード1を同じ関数に代入した結果
test2,Lp8hGvdS ←自分のアカウント2のパスワード2を同じ関数に代入した結果
(後略)
仮に、それぞれのアカウントに関するパスワードが全て別の関数に代入されていたら。「パスワードデータファイル」を抜かれたとしてもどうってことはありません。
勿論そんなことは現実的に不可能です(アカウントが数個なら可能かもしれませんが)。しかしそれを簡易的に実現する方法はある。「関数」に対する入力を複数にすれば良い。
□例1
y=3x+ay:パスワードデータファイルに保存する文字列
x:(生の)パスワード
a:アカウント
□例2
y=3x+by:パスワードデータファイルに保存する文字列
x:(生の)パスワード
b:ユーザーが決めた秘密の数字
□例1の結果
数学的に書けば、「y=f(x)」ではなく「y=f(x,a)」。「複数入力&一出力」の関数で暗号化を行えば「『一つの入力と一つの出力を複数通り抜かれる』が『関数の実体を推測される』」に繋がることはなくなる。xとyが分かってもaが分からなければ関数を推測されることはないしyからxを求められることもない。「アカウント」はクラッカーから見えますが、「それがパスワード暗号化関数への入力に使われている」というコトは見えにくいでしょう。「入力」を複数にすれば関数の実体は推測されにくくなる。
勿論、「鍵(=暗号化関数に対するパスワード以外の入力)がアカウントである」というコトがバレてしまえばパスワードクラック概論(2)と同じ方法で「yamadaの正しいパスワード」の解読を試みられるでしょう。
x=(y-a)/3 ←上記□例1の関数を「x=〜」の形に直した式
関数の実体さえ分かれば逆関数を求めることは可能ですからね。
□例2の結果
数学的に書けば、「y=f(x)」ではなく「y=f(x,b)」。□例1と同様に「関数の実体は推測されにくく」なりますし、また仮に推測されたところで「ターゲットyamadaに関するb」がバレなければ「yamadaの正しいパスワード」は推測されない。
勿論、関数の実体を推測された上で更に「鍵(=yamadaの秘密の数字)」がバレてしまえばパスワードクラック概論(2)と同じ方法で「yamadaの正しいパスワード」の解読を試みられるでしょう。
x=(y-b)/3 ←上記□例2の関数を「x=〜」の形に直した式
関数の実体さえ分かれば逆関数を求めることは可能ですからね。
※補足
今回の話は「電子メールの暗号化」にも利用されています。
例えばフリーソフトシークレットE-Mail(たかまる法師のお寺内で公開されています)は「送信者がある『鍵』でメール内容を暗号化し、受信者も同じ『鍵』でメール内容を解読する」という仕組みで動作するようです。シークレットE-Mailという「関数」があっても「鍵」がなければ解読はできない、と。
今回の話は「電子メールの暗号化」にも利用されています。
例えばフリーソフトシークレットE-Mail(たかまる法師のお寺内で公開されています)は「送信者がある『鍵』でメール内容を暗号化し、受信者も同じ『鍵』でメール内容を解読する」という仕組みで動作するようです。シークレットE-Mailという「関数」があっても「鍵」がなければ解読はできない、と。

TrackBack
この記事へのトラックバック