我是Android新手,我正在制作应用,我想专注于应用的安全性,我发现这个link,其中说“将敏感信息保存在RAM中最短的时间可以通过在使用后将其设置为null来实现。“后来它说“避免使用Java的String类来保存敏感信息。而是使用char数组或字节数组。原因是因为字符串是不可变的”
在我的应用程序中,我有一个类似于此的代码(此代码只检查用户输入的PIN并将其与内部存储中的另一个进行比较):
public class Class extends Activity implements OnClickListener{
private static final String fileName = "FilePin";
private Button button;
private EditText editText = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_example);
editText = (editText) findViewById(R.id.editText);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);
}
@Override
public void onClick(View v){
if (readPin()) {
textView.setText(new char[]{' '}, 0, 0);
Intent intent = new Intent(this, OtherClass.class);
startActivity(intent);
}
}
// this method read the file where the PIN the user create is save in the internal storage
public boolean readPin(){
StringBuilder stringBuilder = null;
StringBuilder inputString;
try {
BufferedReader inputReader = new BufferedReader(new InputStreamReader
(openFileInput(fileName)));
stringBuilder = new StringBuilder();
while ((inputString = new StringBuilder(inputReader.readLine())) != null) {
stringBuilder.append(inputString);
}
inputReader.close();
} catch (Exception e) {
e.printStackTrace();
}
inputString = new StringBuilder("");
assert stringBuilder != null;
boolean comparePin = compare(stringBuilder);
stringBuilder = new StringBuilder("");
return comparePin;
}
// this method compare the PIN saved with the PIN the users enters
private boolean compare(StringBuilder pinSaved){
if (!editText.getText().toString().equals(pinSaved.toString())) {
Toast.makeText(getBaseContext(), "the PIN it´s incorrect"
, Toast.LENGTH_SHORT).show();
pinSaved = new StringBuilder("");
return false;
}
else {
pinSaved = new StringBuilder("");
return true;
}
}
}
对于我在预览中读到的link我没有使用String而是使用StringBuilder,因为StringBuilder是可变的,在我使用之后将值更改为“stringBuilder = new StringBuilder(”“);” ,我没有使用char [],因为我不知道如何将editText保存到char []变量或如何将保存在文件中的PIN保存在char []变量中,我没有找到关于在这些情况下如何使用char []。
我的问题是:这个案例对于Android应用程序是安全的还是更好地更改为char []变量?,对于Android,StringBuffer类是不安全的吗?如何将editText值保存在char []中?如何在char []变量中保存文件?
答案 0 :(得分:0)
stringBuilder = new StringBuilder("");
上述内容弱于将char[]
归零。原始StringBuilder
以及内部缓冲区将保留在内存中。在某些时候,垃圾收集器会将内存标记为空闲,稍后,某些内容可能会覆盖它。
将char[]
归零可让您更好地控制何时覆盖秘密。
此外,StringBuilder
带有逻辑,可在需要更多空间时自动复制其内部char[]
缓冲区。你需要小心确保它永远不会这样做。简单char[]
很不方便,因为你无法调整它的大小,但在这种情况下它很好,因为任何复制它的尝试都是明确的。
有关如何将char[]
转换为可传递至EditText.setText
的表单,请参阅Java: convert a char[] to a CharSequence。