感谢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();
}
}
}
答案 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();
}
}
}