Обрабатывать значение предпочтения перед сохранением в Android?

#android #encryption #passwords #preferences

#Android #шифрование #пароли #предпочтения

Вопрос:

Мне нужно зашифровать свой пароль, прежде чем сохранять его в локальной базе данных Android. Все работает нормально без шифрования, у меня есть preferences.xml и так. Как я могу вызвать функцию после изменения значения предпочтения (например, пароля)? Вот мой код:

 public class Preferences extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);

            // Get the custom preference
            Preference customPref = (Preference) findPreference("pass");

            customPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener(){
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                String crypto = SimpleCrypto.encrypt("MYSECRETKEY", newValue.toString()); // encrypt
                // Here is where I'm wrong, I guess.
                SharedPreferences settings = getSharedPreferences("preferences", MODE_PRIVATE);
                SharedPreferences.Editor editor = settings.edit();
                editor.putString("pass", crypto);
                editor.commit();
            });
    }
}
  

P.S: Вот так, когда я меняю пароль, он сохраняет пароль без шифрования.

Ответ №1:

Я сделал это, расширив базовую EditTextPreference и зашифровав / расшифровав там пароль:

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

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

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

  @Override
  public String getText() {
    String value = super.getText();
    return SecurityUtils.decrypt(value);
  }

  @Override
  protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
    super.setText(restoreValue ? getPersistedString(null) : (String) defaultValue);
  }

  @Override
  public void setText(String text) {
    if (Utils.isStringBlank(text)) {
      super.setText(null);
      return;
    }
    super.setText(SecurityUtils.encrypt(text));
  }
}
  

Есть несколько вызовов моих личных утилит, но я думаю, что код довольно ясен в том, что вам нужно сделать.

Комментарии:

1. Спасибо за идею, я создал свой собственный класс extender, но как мне реализовать его на экране настроек? С помощью записи <EncryptedEditTextPreference /> в XML-файле? Я пробовал этот способ, но безуспешно.

2. Это должно быть полное имя, например <com.yourpackage. yourapp. EncryptedEditTextpreference />