LoginSignup
15
19

More than 5 years have passed since last update.

Androidアプリ開発でログイン情報を端末に保存する方法(パスワードはAES暗号化)

Last updated at Posted at 2016-11-02

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);
   }

他にももっと簡単な方法があるのかもしれないけど、
ログイン以外にも様々なケースで使えると思うのでメモです。
簡単な方法知っている方いらっしゃったらぜひおしえてください!

15
19
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
19