アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在下記のようにし、暗号化を行っています。

-------------------------以下ソース
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 を使用

A 回答 (6件)

#2#4です。



>MD5ってセキュリティ的にも問題ないのでしょうか?
現在ではMD5の複合に成功した例もあるらしいですが
まだ解析は困難なのが現状みたいです。

Wikipedia
http://ja.wikipedia.org/wiki/MD5

上記のリンクによると政府推奨暗号はSHA-256以上になっているようですが
企業のシステムなどではいまだにMD5を使っていることが多いみたいです。
私も仕事でシステム開発をしていますが暗号化はMD5を使用しています。
    • good
    • 0

#1です。



まず、注意から。

質問に
>ログイン画面でパスワードを暗号化するために
とあるので、クライアントとサーバー間の情報漏れを防ぐため、
クライアント側で暗号化するのだと理解しました。
また、#1のお礼で「SSLは使わない」と回答があったため何の疑問も感じませんでした。
サーバーに保存するときに暗号化をすると言う話なら「SSLは関係ない」と言うべきだったと思います。
もしくは「SSLとは何か知りません」とすれば良かったと思います。


さて、質問の件ですが、

1.ログイン画面でID、パスワードを入力
2.ID、パスワードは生のまま(平文のまま)サーバーへ送信
3.サーバー側で受け取ったID、パスワードのうち、IDは平文でパスワードは暗号化しサーバー内に保存

ということでよろしいでしょうか?


だとすると、想定しているのはサーバー内のファイルが、ハッキングや管理者のコピーなどによって中身を見られた場合だと思います。

しかし、その場合パスワードだけMD5などでハッシュしてもあまり意味がありません。
個人情報などの重要な情報の漏洩を防ぐためデータ全てを暗号化をする必要があります。
この場合、個人情報などは平文が必要になるので、ハッシュではなく暗号を使わなければなりません。

逆に、重要な情報が保存されていないのであれば、暗号化する必要もないと思われます。
ID、パスワードだけの情報で買い物をすることはできませんし、できるのはせいぜい事前登録型の掲示板くらいなものでしょうか?
その程度のものに暗号化する必要はないと思います。

また、重要な情報を含むのであれば、データを平文のまま送信することの方が問題だと思います。

まあ、参考意見程度に考えて下さい。
    • good
    • 1

#2です。



#3の回答を見てちょっと疑問に感じたのですが
暗号化する場所はどこなのでしょう?
・クライアントでパスワードを暗号化して送信するのか
・サーバでパスワードを受け取って暗号化するのか

私はてっきりサーバ側で暗号化するものだと思い下記の回答をしたのですが
もしクライアント側でするのなら#3の方が言ってる様な問題点が出てきます。
サーバ側だとすると何の問題もなくできると思うのですが#2で答えたpropertiesの内容はちょっと間違いです。
パスワードと暗号キーを一緒に保存しても意味ないですね・・・
まぁ暗号キーとパスワードを別々に保存してWEB上で見れないところにおいておけば
いいかと

より安全なのはクライアントで暗号化しサーバ側で複合、再度別の暗号キーで暗号化というのが理想なんですかねぇ・・・
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
#3の方のお礼にも記述しましたが、現在MD5を使うことを考えています。
MD5ってセキュリティ的にも問題ないのでしょうか?

お礼日時:2007/07/18 23:54

#1です。


直接の回答ではないので、「アドバイス」としておきます。

SSLを使わないのだとすると、鍵の置き場所以前の話でいくつか問題点がでてきます。


・クライアント側は専用のプログラム、またはアプレットなどが必要となる。
・鍵交換をどのように行うか
・鍵を1ユーザーにつき1つにする場合、クライアント側での鍵保存をどうするか

など、セキュリティー的にも問題がでてきます。


>できる限りセキュアなアプリを作りたいと思っています。

そうなるとSSLの仕組みを自分で実装することになり、その場合鍵は使い捨てなので保存する必要はありません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>・クライアント側は専用のプログラム、またはアプレットなどが必要>となる。
>・鍵交換をどのように行うか
>・鍵を1ユーザーにつき1つにする場合、クライアント側での鍵保存>をどうするか

暗号化はサーバ側だけでするつもりだったのですが、クライアント側も意識する必要があるのでしょうか?
今考えているのは、
(1)新規登録画面から入力されたパスワードをサーバ側(JAVA)で暗号化、保存
(2)次回よりログイン時に画面から入力された値を暗号化、照合
っていった具合です。

復号できること自体に問題あり?のような気がしてきたので、MD5等の不可逆のアルゴリズムを使うことを考えています。
MD5って結構使われてるんでしょうか?

お礼日時:2007/07/18 23:52

私の場合暗号化はMD5を使っているため暗号キーについては私の認識ですが・・・



暗号キーは作成したパスワードごとに作成するということでいいと思います。
つまりパスワード1つに対して暗号キー1つってことですね。

もし、暗号キー、パスワードを保存するならpropertiesファイルでWEB-INF以下に置くといいと思います。
WEB-INF以下ならWEB上からアクセスできないので

//propertisの記述
ユーザー名=パスワード,暗号キー

といった感じで保存するといいのでは?
    • good
    • 0

通常、WEBで暗号化するときはSSLを使います。


SSLを使えば、暗号化処理はブラウザなどが行ってくれるため、
画面開発者は暗号化を意識しないで済みます。

SSLでは何か問題があるのでしょうか?
    • good
    • 0
この回答へのお礼

返信ありがとうございます。
すいませんがSSLは使わないという前提で質問させて頂いています。
あとデータベースを使わない場合、パスワード・暗号キーなどはどこに保存しておくべきでしょうか?

お礼日時:2007/07/14 09:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!