Androidアプリでまずログインが必要な場合、ユーザにとってパスワード等のアカウント情報は次回以降自動入力にしてほしいところ。
SharedPreferencesという、端末内に入力データを保存、取得できる仕組みを用い実現できるようです。
その方法を紹介します。といいますかメモです。
ログイン成功時にパスワードはAESで暗号化し保存、次回以降ログイン画面表示時にAESで複合化し表示という処理になります。
【アカウント情報の保存】
// ログイン成功時処理
// ログインIDとログインパスワードのビューオブジェクトを取得
EditText editTextLoginAccount = (EditText)findViewById(R.id.editTextLoginAccount);
EditText editTextLoginPass = (EditText)findViewById(R.id.editTextLoginPass);
// 「pref_data」という設定データファイルを読み込み
SharedPreferences prefData = getSharedPreferences("pref_data", MODE_PRIVATE);
SharedPreferences.Editor editor = prefData.edit();
// パスワードは暗号化
SecretKeySpec keySpec = new SecretKeySpec("abcdefg098765432".getBytes(), "AES"); // キーファイル生成
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encrypted = cipher.doFinal(editTextLoginPass.toString().getBytes()); // byte配列を暗号化
String up = Base64.encodeToString(encrypted, Base64.DEFAULT); // Stringにエンコード
// 入力されたログインIDとログインパスワード
editor.putString("account", editTextLoginAccount.getText().toString());
editor.putString("pass", up);
// 保存
editor.commit();
【アカウント情報の取得と設定】
// ログイン画面表示処理
// 「pref_data」という設定データファイルを読み込み
SharedPreferences prefData = getSharedPreferences("pref_data", MODE_PRIVATE);
String account = prefData.getString("account", "");
String pass = prefData.getString("pass", "");
// パスワード複合化処理
String up = "";
SecretKeySpec keySpec = new SecretKeySpec("abcdefg098765432".getBytes(), "AES"); // キーファイル生成 暗号化で使った文字列と同様にする
Cipher cipher = null;
try {
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decByte = Base64.decode(pass, Base64.DEFAULT); // byte配列にデコード
byte[] decrypted = cipher.doFinal(decByte); // 複合化
up = new String(decrypted); // Stringに変換
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}
// 空チェック
if (account != null && account.length() > 0) {
// 保存済の情報をログインID欄に設定
this.editTextLoginAccount.setText(account);
}
if (up != null && up.length() > 0) {
// 保存済の情報をログインパスワード欄に設定
this.editTextLoginPass.setText(up);
}
他にももっと簡単な方法があるのかもしれないけど、
ログイン以外にも様々なケースで使えると思うのでメモです。
簡単な方法知っている方いらっしゃったらぜひおしえてください!