4

Webサーバーに基づくAndroidアプリを開発しています。アプリをインストールしたユーザーは、ログインできるように Web で登録する必要があります。誰かがログインしようとすると、私は でその情報を確認しますAPI

だから私は永続化と暗号化のプロセスに興味があります。値を暗号化する必要がありますSharedPreferencesか? 暗号化が必要な場合、効率的な方法は何ですか?

最後になりましたが、SharedPreferences はセキュリティの点で十分ですか?

ありがとう。

4

2 に答える 2

3

暗号化は簡単ですが、本当の問題はどのキーを使用するかです。アプリでキーをハードコーディングするか、既知の値からキーを導出すると、デバイスにアクセスできる人なら誰でもそれらの値を簡単に復号化できます。あなたが達成しているのは単なる難読化です。Android にはシステム キーストアへのパブリック API がないため、実際のパスワードを保存する必要がある場合にできることは他にあまりありません。もちろん、ユーザーがアプリを起動するたびにパスワードを入力させない限り、そのような目的は無効になります。

サーバーとクライアントの両方を制御する場合、別の方法として、何らかの形式のトークン ベースの認証を使用し、トークンのみを保存する方法があります。トークンは有効期限が切れて取り消される可能性があるため、実際のパスワード (他のサイトでも使用される可能性があります) を公開するよりも、誰かがトークンを手に入れた場合の損害ははるかに少なくなります。

于 2012-07-25T07:04:48.337 に答える
2

もちろん、ログイン、パスワード、メールなどのユーザー設定を暗号化する必要があります。私は保管することを好みSharedPreferencesますが、セキュリティの観点からは十分です。

私は StackOverflow でこの 2 つのメソッドを見つけました。

protected String encrypt( String value ) {
    try {
        final byte[] bytes = value!=null ? value.getBytes(UTF8) : new byte[0];
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
        SecretKey key = keyFactory.generateSecret(new PBEKeySpec(SEKRIT));
        Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
        pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(Settings.Secure.getString(context.getContentResolver(),Settings.System.ANDROID_ID).getBytes(UTF8), 20));
        return new String(Base64.encode(pbeCipher.doFinal(bytes), Base64.NO_WRAP),UTF8);
    } catch( Exception e ) {
        throw new RuntimeException(e);
    }
}

protected String decrypt(String value){
    try {
        final byte[] bytes = value!=null ? Base64.decode(value,Base64.DEFAULT) : new byte[0];
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
        SecretKey key = keyFactory.generateSecret(new PBEKeySpec(SEKRIT));
        Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
        pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(Settings.Secure.getString(context.getContentResolver(),Settings.System.ANDROID_ID).getBytes(UTF8), 20));
        return new String(pbeCipher.doFinal(bytes),UTF8);
    } catch( Exception e) {
        throw new RuntimeException(e);
    }
}

リンクが見つかりませんでした。見つかった場合は、回答を編集します。

編集:ソースが見つかりました。ここですべての議論を見ることができます。

于 2012-07-25T06:51:15.140 に答える