0

私はデスクトップ アプリケーションを開発しています。ユーザーがアプリケーションにアクセスするために入力する必要があるログイン フォームがあります。

このログインフォームには がJCheckBoxあり"Remember me"ます。

ユーザーが ID とパスワードを入力して にチェックを入れると、"Remember me" JCheckBoxこの ID とパスワードを暗号化してファイルに保存するプログラムが必要です。

私の質問は、これらのデータをどのように暗号化できますか? それらを暗号化してからファイルから読み取りたい場合、それらを解読する必要がありますか?

4

2 に答える 2

0

あなたの質問には、正確な回答を得るのに十分な詳細がありませんが、試してみます.

まず、パスワードをローカルで暗号化しないでください。これは、アプリケーションでも暗号化を解除する必要があるためです。したがって、対称キーがメモリに保持され、脆弱になります。

ユーザーのパスワードをローカルで検証する必要がある場合は、一方向ハッシュ関数とソルトを使用します。これは、安全ではないプレーンテキスト ファイルをディスクに書き込む必要があることを意味することに注意してください (ファイルへの書き込みアクセス権がある場合、パスワード ハッシュを変更できます)。これを克服するには、対称暗号化スキームを使用し、ファイルを読み書きするたびにキーを要求する必要があります。これは、人々がファイルを破損するのを防ぐこともできません。

クライアント/サーバー アプリケーションについて話している場合は、サーバー上で一時的なトークンを生成し、何らかの有効期限メカニズムを実装します。

于 2013-05-14T20:20:09.427 に答える
0

最善の解決策は、解読される可能性があるため、ユーザー名/パスワードを暗号化/復号化しないことです。とにかく、データの暗号化/復号化に使用できる Java コードの例を次に示します。[AES][1] アルゴリズムを使用します。

警告: このコードは秘密鍵を Java クラス内に保持しますが、これは鍵を安全に保管する方法ではありません。このクラスにアクセスできる人なら誰でも秘密鍵を表示し、この鍵を使用して暗号化された情報を復号化できるからです。キーは外部ファイルに保存する必要があります。

    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;

    import org.apache.commons.codec.binary.Base64;

    public class CipherUtil {

        private static Base64 coder;
        // linebreak
        private static byte[] linebreak = {}; // Remove Base64 encoder default
        private static String secret = "qhebp92ihc13g741"; // secret key length must
        // be 16
        private static SecretKey key;
        private static Cipher cipher;

        static {
            try {
                key = new SecretKeySpec(secret.getBytes(), "AES");
                cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");
                coder = new Base64(32, linebreak, true);
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }

        public static synchronized String encrypt(String plainText) throws Exception {
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] cipherText = cipher.doFinal(plainText.getBytes());
            return new String(coder.encode(cipherText));
        }

        public static synchronized String decrypt(String codedText) throws Exception {
            byte[] encypted = coder.decode(codedText.getBytes());
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] decrypted = cipher.doFinal(encypted);
            return new String(decrypted);
        }
    }


  [1]: http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
于 2013-05-14T20:23:56.453 に答える