2017-02-22 18 views
-2

谁能告诉我:
1.如何从EditText上的字符转换成字符数组,而不使用字符串

2.如何显示的内容在TextView或EditText中的char数组,再次不使用字符串。
我可以做到这一点,如果我使用字符串作为中间步骤,但我不想这样做是出于安全原因。EDITTEXT从字符数组&不使用字符串

回答

0

琴弦之间的关系被存储在阵列中的数据,这将是最终GC-ED(或者可能甚至通过填充与null阵列覆盖它,以使阵列存储器将不再包含于特定String引用实例)。

因此,如果有人会在String池内存中找到字符串内容(可能会比GC管理的内存池保持更长时间的完整状态),他们将必须找出阵列中的哪10个字符串在一起 - 从字符串内容本身。

然后,如果你的代码是在相同的地点和时间创建和分配数组和10个字符串,很可能String池内存将相互分配所有10个字符串,所以即使没有数组数据它也可能容易发现这10个字符串彼此属于一起(特别是如果敏感字符串的内容与您在代码中使用的其他普通字符串不同)。

你可以考虑通过char[]创建你自己的“SecureString”类来实现CharSequence接口,并且有析构函数清理内容。哦,等等,这是愚蠢的Java,而不是C++。嗯...那么运气不好,你必须手动调用一些.wipe()方法来确保那些“SecureString”实例尽快被删除,只要你愿意。

当然,如果你实施CharSequence,这可能不是非常聪明的想法,但从安全的角度来看,它可能是最好的一些SecureString类没有实现任何通用接口(并且重载toString返回非敏感的东西,甚至可能删除引用地址,也许只是为了好玩的星号)。只是忍受使用它的痛苦。

0

要创建可以安全清理的密码,只要密码验证完成并且不再需要密码,请使用char[]并填写0

//example password 
char[] pass = {'t', 'e', 's', 't', '_', 'p', 'a', 's', 's'}; 

//validate your password here 
boolean isValid = validatePass(pass); 

//now explicitly override the password's characters 
for (int c = 0; c < pass.length; c++) 
    pass[c] = 0; 

//do something depending isValid 
if (isValid) { 
    //show logged user or whatever 
} else { 
    //show error message or whatever 
}