USP Browser 開発日誌 EditTextPreferenceで暗号化

どうも、Nです。
USP-Browserでは、ユーザーのパスワード等をSharedPreferenceに保存しているわけですが、
SharedPreferenceでの設定内容は、端末のrootさえ取得していれば、簡単に見れてしまいます。
そこで、機密情報はSharedPreference以外に保存するか、
暗号化してSharedPreferenceに保存する必要があります。

PreferenceActivityが使いたいということもあり、今回はSharedPreferenceに暗号化して保存します。

PreferenceActivityは直接SharedPrefernceの内容を読みに行くため、
EditTextPreferenceを継承したEditCiphertextPreferenceなるクラスを作り、
内容を取得、保存するメソッドをオーバーライドすることで、暗号化に対応させます。

EditTextPreference等の文字列の内容は
getPersistedString(String defaultReturnValue)で取得し、
persistString(String value)で保存します。
このメソッドをオーバーライドし、取得と保存の際に複合化と暗号化をすれば大丈夫です。
暗号化の手段は様々なので、今回は単に”encrypted_”を付け加えたものを暗号文とします。

ja/gr/java_conf/csgusp/uspbrowser/ui/EditCiphertextPreference.java

package ja.gr.java_conf.csgusp.uspbrowser.ui;

import android.content.Context;
import android.preference.EditTextPreference;
import android.util.AttributeSet;

public class EditCiphertextPreference extends EditTextPreference {
	public EditCiphertextPreference(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public EditCiphertextPreference(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public EditCiphertextPreference(Context context) {
		super(context);
	}

	@Override
	public String getPersistedString(String defaultReturnValue) {
		String ciphertext;
		String text;

		ciphertext = super.getPersistedString(defaultReturnValue);
		if (ciphertext == null || ciphertext.equals(defaultReturnValue)) {
			return ciphertext;
		}
		text = decrypt(ciphertext);

		return text;
	}

	@Override
	public boolean persistString(String text) {
		String chipertext;

		chipertext = encrypt(text);

		return super.persistString(chipertext);
	}

	private String decrypt(String ciphertext) {
		String text;

		if (ciphertext != null) {
			text = ciphertext.replace("encrypted_", "");
		} else {
			text = null;
		}

		return text;
	}

	private String encrypt(String text) {
		String ciphertext;

		if (text != null) {
			ciphertext = "encrypted_" + text;
		} else {
			ciphertext = null;
		}

		return ciphertext;
	}
}

それぞれ、複合化や複合化を行ってから、
スーパークラスのメソッドを呼び出していることがわかると思います。
encrypt(String text)とdecrypt(String chipertext)を書き換えれば、本格的に使えるようになります。
設定を読み出す側でも複合化できなければ意味がないので、
この中で実際に暗号処理するよりは、
別のクラスをすぐに呼び出すような実装をしたほうがよいと思います。

PreferenceActivityに渡すxmlは次のような感じで書きます。
名前空間は当環境のものですので気を付けてください。

res/xml/preference.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <EditTextPreference
        android:key="portal_user_id"
        android:title="@string/portal_user_id_preference_title" />
    <ja.gr.java_conf.csgusp.uspbrowser.ui.EditCiphertextPreference
        android:key="portal_password"
        android:title="@string/portal_password_preference_title" />
</PreferenceScreen>

1つ目は、通常のEditTextPreferenceですが、
2つ目は、暗号処理の実装されたEditChipertextPreferenceになっています。
本当は、user_idも機密情報なので暗号化しますが…。

こういう細かなところの開発は楽なのですが…。重要な部分が進まない(-_-;)。

  1. コメント 0

  1. トラックバック 0

return top