扩展基础EditTextPreference和加密/解密

时间:2012-03-13 01:07:46

标签: android encryption passwords preferences

感谢dmon和此处的示例Process the value of preference before save in Android?

我能够获得基本代码。但我的值并没有在preferences.xml中加密存储在设备上,我知道这是我的一个简单错误(java新手)。

我的加密和解密类在EditTextPreference代码之外工作。

亲切的问候,

麦克

我的偏好.xml

    <ping.test.com.EncryptedEditTextpreference 
        android:key="key" 
        android:summary="Enter Your Public Key" 
        android:title="Public Key" 
        android:inputType="textPassword"/>

</PreferenceCategory>

我的类扩展EditTextPreference

package ping.test.com;

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

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();
    try {
        return SimpleCrypto.decrypt("BiteMe", value);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return value;
  }

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

  @Override
  public void setText(String text) {

        try {
            super.setText(SimpleCrypto.encrypt("BiteMe", text ));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

  }
}

2 个答案:

答案 0 :(得分:0)

首先,我知道拥有Preference视图很方便,但在特殊情况下我更喜欢使用简单的EditText并在SharedPreferences内手动保存首选项。

回答你的问题:根据它应该有用的文档,你尝试了什么。要更接近错误,请尝试添加以下日志:

@Override
public void setText(String text) {
    Log.v("setText", "from " + text);
    try {
        String to = SimpleCrypto.encrypt("BiteMe", text );
        Log.v("setText", "to " + to);
        super.setText(to);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

验证您的SimpleCrypt类是否按预期工作,并且可以向EditText添加TextWatcher并将其记录下来以查看会发生什么。

请注意,这可能是完美的,因为攻击者能够反编译您的apk并查看此加密的工作方式!

答案 1 :(得分:-1)

在显示设置时没有显示加密值,因为我屏蔽了pswd。我只想在存储时加密

protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
    if (!restoreValue) {
        super.setText((String) defaultValue);
    }
    else {
        try {
            String decrypted = SimpleCrypto.decrypt(Constants.MasterKey, getPersistedString(null));
            super.setText(decrypted);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}