- ベストアンサー
暗号キーの保存
現在下記のようにし、暗号化を行っています。 -------------------------以下ソース KeyGenerator kg = KeyGenerator.getInstance("AES"); SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); // 128ビットで暗号化 kg.init(128, random); Key key = kg.generateKey(); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key); // バイト配列に変換 byte[] byteArray = cipher.doFinal(argStr.getBytes()); 暗号化について調べていると、暗号化(復号化)キーは乱数などで作ったほうが良いと書いてありました。 そこで質問なのですが、ログイン画面でパスワードを暗号化するために上記コーディングを行っているのですが、乱数でキーを作成した場合、各ユーザごとにキーが作成されるって認識であってますでしょうか? その場合、暗号キーはどこに保存しておくのが望ましいでしょうか? できる限りセキュアなアプリを作りたいと思っています。 (もちろん100%はないとは思っていますので) ※データベースは使えない環境を想定しています。 以上宜しくお願いします。 tomcat5.0 jdk.1.4.2 を使用
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#2#4です。 >MD5ってセキュリティ的にも問題ないのでしょうか? 現在ではMD5の複合に成功した例もあるらしいですが まだ解析は困難なのが現状みたいです。 Wikipedia http://ja.wikipedia.org/wiki/MD5 上記のリンクによると政府推奨暗号はSHA-256以上になっているようですが 企業のシステムなどではいまだにMD5を使っていることが多いみたいです。 私も仕事でシステム開発をしていますが暗号化はMD5を使用しています。
その他の回答 (5)
- ngsvx
- ベストアンサー率49% (157/315)
#1です。 まず、注意から。 質問に >ログイン画面でパスワードを暗号化するために とあるので、クライアントとサーバー間の情報漏れを防ぐため、 クライアント側で暗号化するのだと理解しました。 また、#1のお礼で「SSLは使わない」と回答があったため何の疑問も感じませんでした。 サーバーに保存するときに暗号化をすると言う話なら「SSLは関係ない」と言うべきだったと思います。 もしくは「SSLとは何か知りません」とすれば良かったと思います。 さて、質問の件ですが、 1.ログイン画面でID、パスワードを入力 2.ID、パスワードは生のまま(平文のまま)サーバーへ送信 3.サーバー側で受け取ったID、パスワードのうち、IDは平文でパスワードは暗号化しサーバー内に保存 ということでよろしいでしょうか? だとすると、想定しているのはサーバー内のファイルが、ハッキングや管理者のコピーなどによって中身を見られた場合だと思います。 しかし、その場合パスワードだけMD5などでハッシュしてもあまり意味がありません。 個人情報などの重要な情報の漏洩を防ぐためデータ全てを暗号化をする必要があります。 この場合、個人情報などは平文が必要になるので、ハッシュではなく暗号を使わなければなりません。 逆に、重要な情報が保存されていないのであれば、暗号化する必要もないと思われます。 ID、パスワードだけの情報で買い物をすることはできませんし、できるのはせいぜい事前登録型の掲示板くらいなものでしょうか? その程度のものに暗号化する必要はないと思います。 また、重要な情報を含むのであれば、データを平文のまま送信することの方が問題だと思います。 まあ、参考意見程度に考えて下さい。
- DMXbw
- ベストアンサー率66% (4/6)
#2です。 #3の回答を見てちょっと疑問に感じたのですが 暗号化する場所はどこなのでしょう? ・クライアントでパスワードを暗号化して送信するのか ・サーバでパスワードを受け取って暗号化するのか 私はてっきりサーバ側で暗号化するものだと思い下記の回答をしたのですが もしクライアント側でするのなら#3の方が言ってる様な問題点が出てきます。 サーバ側だとすると何の問題もなくできると思うのですが#2で答えたpropertiesの内容はちょっと間違いです。 パスワードと暗号キーを一緒に保存しても意味ないですね・・・ まぁ暗号キーとパスワードを別々に保存してWEB上で見れないところにおいておけば いいかと より安全なのはクライアントで暗号化しサーバ側で複合、再度別の暗号キーで暗号化というのが理想なんですかねぇ・・・
- ngsvx
- ベストアンサー率49% (157/315)
#1です。 直接の回答ではないので、「アドバイス」としておきます。 SSLを使わないのだとすると、鍵の置き場所以前の話でいくつか問題点がでてきます。 ・クライアント側は専用のプログラム、またはアプレットなどが必要となる。 ・鍵交換をどのように行うか ・鍵を1ユーザーにつき1つにする場合、クライアント側での鍵保存をどうするか など、セキュリティー的にも問題がでてきます。 >できる限りセキュアなアプリを作りたいと思っています。 そうなるとSSLの仕組みを自分で実装することになり、その場合鍵は使い捨てなので保存する必要はありません。
お礼
回答ありがとうございます。 >・クライアント側は専用のプログラム、またはアプレットなどが必要>となる。 >・鍵交換をどのように行うか >・鍵を1ユーザーにつき1つにする場合、クライアント側での鍵保存>をどうするか 暗号化はサーバ側だけでするつもりだったのですが、クライアント側も意識する必要があるのでしょうか? 今考えているのは、 (1)新規登録画面から入力されたパスワードをサーバ側(JAVA)で暗号化、保存 (2)次回よりログイン時に画面から入力された値を暗号化、照合 っていった具合です。 復号できること自体に問題あり?のような気がしてきたので、MD5等の不可逆のアルゴリズムを使うことを考えています。 MD5って結構使われてるんでしょうか?
- DMXbw
- ベストアンサー率66% (4/6)
私の場合暗号化はMD5を使っているため暗号キーについては私の認識ですが・・・ 暗号キーは作成したパスワードごとに作成するということでいいと思います。 つまりパスワード1つに対して暗号キー1つってことですね。 もし、暗号キー、パスワードを保存するならpropertiesファイルでWEB-INF以下に置くといいと思います。 WEB-INF以下ならWEB上からアクセスできないので //propertisの記述 ユーザー名=パスワード,暗号キー といった感じで保存するといいのでは?
- ngsvx
- ベストアンサー率49% (157/315)
通常、WEBで暗号化するときはSSLを使います。 SSLを使えば、暗号化処理はブラウザなどが行ってくれるため、 画面開発者は暗号化を意識しないで済みます。 SSLでは何か問題があるのでしょうか?
お礼
返信ありがとうございます。 すいませんがSSLは使わないという前提で質問させて頂いています。 あとデータベースを使わない場合、パスワード・暗号キーなどはどこに保存しておくべきでしょうか?
お礼
回答ありがとうございます。 #3の方のお礼にも記述しましたが、現在MD5を使うことを考えています。 MD5ってセキュリティ的にも問題ないのでしょうか?