- ベストアンサー
パスワードの暗号化
いつもお世話になっております。 今回はjavascriptをつかった暗号化についてお聞きしたいです。 パスワードをサーバーに送る際、そのまま送ると少し詳しい人なら丸わかりになってしまいます。 そこで暗号化をして送信したく、いろいろ探してみましたがなかなかいい方法が見当たりません。 des.jsというライブラリを見つけましたが、復号化のコードも書いてあり、簡単に復号できてしまうような気がします。 いろいろ探していていいと思ったのは、perlのcryptのような不可逆の暗号化の方法でした。 そのような方法はjavascriptにあるのでしょうか? またそれ以外でもなにかいい方法はありますでしょうか? 完全に隠蔽するのは不可能だということはわかっておりますが、 できる限りわかりにくくする方法を知りたいです。 以上の点、ご教授お願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
https で SSL 通信することをお勧めします。 > des.jsというライブラリを見つけましたが、復号化のコードも書いてあ > り、簡単に復号できてしまうような気がします。 信頼できる暗号化というのは、アルゴリズムが公開されており、専門家に よる攻撃に長年耐え抜いたものだと思っています。そういったものでは、 暗号化に使用するキーさえ秘密にできれば、アルゴリズムが公開されてい ても有意な時間で解読することはできません。 ウェブブラウザでパスワードを暗号化してサーバに送りたいとのことで すが、それをするには秘密にすべきキーをブラウザとサーバで共有 するため、暗号化に一番大切な情報(キー)を攻撃者(ブラウザの利用者) に渡してしまうことになります。公開キー暗号化を使えば秘密にすべき 情報は渡さないですみますが、それは SSL 通信と同じになるのでわざわ ざ実装することもないでしょう。 > いろいろ探していていいと思ったのは、perlのcryptのような不可逆の > 暗号化の方法でした。 受け取ったサーバは、どうやって検証するでしょうか。 サーバが「事前」に持っているパスワードを同じ方法で暗号化し、 一致するのを確かめます。単純な暗号化だとブラウザがサーバに送る暗 号化されたパスワードを盗んで、そのまま再送すればサーバを騙せてし まいます。CHAP という方式ではサーバから毎回違う種を送り、その種と パスワードを混ぜて暗号化することで、再送攻撃を防いでいます。 ブラウザとサーバの間でしっかりした暗号化を行うのは簡単ではありま せん。ぱっと見、わからないという以上の暗号化を求めるのでしたら、 実装に苦労するよりも、少しお金を出して SSL 証明書を導入された 方がよいと思います。
その他の回答 (5)
<HTML> <script type="text/javascript"> window.onload=function(){ var dy=(new Date()).getTime(); document.getElementById('b').value=dy; for(i=0;i<50;i++){ document.getElementById('a').value+=dy; } } </script> <form method="post" action="test.php"> <textarea onClick="maketxt()" id="a" rows="5" cols="11" style="font-famitry:monospace;overflow:hidden;"></textarea> 横10文字縦5文字になるようにして!<br> hidden<input type="text" name="s1" id="b"><br> password<input type="text" name="s2" id="c"><br> <input type="submit" value="go"> </form> </HTML> --------------------------------- phpの例 <?php $s1=$_POST['s1']; $s2=substr($_POST['s2'],4,4); $s3=time()-floor($s1/1000); if($s3>20) exit('error'); $s4=''; for($i=0;$i<50;$i++) $s4.=$s1; $k1=substr($s4,n(2,2),1); $k2=substr($s4,n(9,2),1); $k3=substr($s4,n(9,4),1); $k4=substr($s4,n(2,4),1); $k5=$k1.$k2.$k3.$k4; if($k5!=$s2) exit('error'); echo "ok!"; function n($x,$y){ $v=($y-1)*10+$x-1;return $v;} ok!を表示させるには 適当な文字を4文字最初に入力し、 5番目が上から2、左から2番目。 6番目が上から2、右から2番目。 7番目が下から2、右から2番目。 8番目が下から2、左から2番目。 これを20秒以内に打ち込むこと。
パスワードを可変にして、鮮度を持たせては? まず、その時の日付をもとに、 (new Date()).getTime で秒数の羅列を作成し(これをA)、それを数十回繰り返しただけの文字列(B)を作成します。 それをあらかじめ決めたサイズのボックスに、文字列(B)を流し込みます。 ここでのサイズは、解析する側のサーバーでの定数となります。 そしてその2次元に広がった特定の部分、数箇所を決めておき それをつなぎ合わせることでキーをつくります。 例えばキーの文字数は8桁、最初の4文字は適当に入力。 5番目は上から2番目で左から2番目、 6番目は下から2番目で右から2番目、 ・・・のようにして8個の数字を作りそれをキーとする サーバーに送るときは、そのキーと最初に作った文字列(A)を 送ります。 受け取る側では、サーバー側の時間の文字列を作成(C)します その(c)と文字列(A)を比べ20秒以前なら無効にする そしてサーバー側でキーを分析する。 ちょっと言葉だけでは判りづらいかもしれませんがどうでしょう?
- yuji
- ベストアンサー率37% (64/169)
No.1, No.2の人に賛成です。 Yahoo!のログイン画面で、httpで通信する場合、パスワードをそのまま 送らずに、JavaScriptで難読化した文字列を送信しているようです。 でも、これは、暗号化ではなく、難読化だと思います。 通信そのものは、筒抜けですので。 暗号化したいのであれば、httpsで通信することをお勧めいたします。
お礼
ご回答ありがとうございます。 httpsですか。 一度調べてみます。 アドバイス感謝します。
- equinox2
- ベストアンサー率48% (321/660)
基本的にNo.1の方に賛成ですが、興味本位でやってみたいのなら Javascriptでかかれたdesのライブラリを使用し、パスワードそのものを 暗号化のキーにしてみてください。 #Unixのパスワードなどと同様な方法です desは、それなりのツールや機器を使えば比較的短時間で解析されてしまいますから、そこまでして解析する必要のない程度の情報のやり取りにしか使えませんが・・ >復号化のコードも書いてあり、簡単に復号できてしまうような気がします。 DESは、アルゴリズム公開の暗号であり、ソースコードがあるから簡単に解析できるものではありません。 #md5のJavascriptがあればその方が良いですが、以前は探せませんでした 10年近く前に、Javascriptだけでパスワード認証を考えた際、暗号化した(複数の)パスワードをソース上に書いても、簡単には解析されない方法として、desのライブラリを使用して実験してみました。 #パスワードの追加・変更にソースを修正する必要があるので実用的ではないですが・・
お礼
ご回答ありがとうございます。 コードがあるからといって簡単にはわからないものなのですか。 やはりまだまだ調べが足りないようなので、もう少し調べてみます。
- VCAT
- ベストアンサー率20% (16/79)
No.1の方に賛成ですが、そもそもJavaScriptだけで暗号化をする というのが滑稽です。どんなに回りくどく書いても時間をかければ 読み解けますから。そこにすべて書いてあるというのがJavaScriptの JavaScriptたるところなわけです。 No.1の言うとおりサーバでの認証が唯一お勧めできる方法です。
お礼
ご回答ありがとうございます。 >>そもそもJavaScriptだけで暗号化をするというのが滑稽です >>そこにすべて書いてあるというのがJavaScriptのJavaScriptたるところなわけです。 いわれてみればそのとおりです。 もう一度考えて見ます。
お礼
ご回答ありがとうございます。 当方あまり知識がなかったのでためになりました。 SSLはよく耳にしますが詳しくは知らないので 一度調べてみたいと思います。