File tree 1 file changed +10
-6
lines changed
1 file changed +10
-6
lines changed Original file line number Diff line number Diff line change 1
- ## 为什么在java中存放密码更倾向于char[ ] 相对于String
1
+ ## 为什么在java中存放密码更倾向于char[ ] 而不是String
2
2
3
3
### 问题
4
4
5
- 在Swing中,password字段有一个getPassword()方法(返回char[ ] ),而不是通常的getText()方法(返回字符串 )。同样的,我遇到一个建议不要使用字符串处理密码 。
6
- 为什么在谈论passwords时,认为字符串会对安全构成威胁 ?感觉使用char[ ] 不是那么的方便。
5
+ 在Swing中,password字段有一个getPassword()方法(返回char[ ] ),而不是通常的getText()方法(返回String字符串 )。同样的,我看到一个建议说不要使用字符串处理密码 。
6
+ 为什么在涉及passwords时,都说字符串会对安全构成威胁 ?感觉使用char[ ] 不是那么的方便。
7
7
8
8
### 回答
9
- String是不可变的。这意味着,一旦你创建了一个String,如果另一个线程可以进行内存转存,在GC回收之前,没有办法可以摆脱数据(除了反射)。(这段翻译的不好,希望大家帮助改正)
10
- 然而对于数组,你可以在使用完就明确的擦除它,你可以用任何你喜欢的数据覆盖这个数组,而且password不会出现在系统的任何地方,甚至在垃圾回收之前。
9
+ String是不可变的。虽然String加载密码之后可以把这个变量扔掉,但是字符串并不会马上被GC回收,一但进程在GC执行到这个字符串之前被dump,dump出的的转储中就会含有这个明文的字符串。那如果我去“修改”这个字符串,比如把它赋一个新值,那么是不是就没有这个问题了?答案是否定的,因为String本身是不可修改的,任何基于String的修改函数都是返回一个新的字符串,原有的还会在内存里。
10
+
11
+ 然而对于数组,你可以在抛弃它之前直接修改掉它里面的内容或者置为乱码,密码就不会存在了。但是如果你什么也不做直接交给gc的话,也会存在上面一样的问题。
12
+
11
13
所以,这是一个安全性的问题--但是,即使使用char[ ] 也仅仅是降低了攻击者攻击的机会,而且仅仅对这种特定的攻击有效。
12
- 编辑:正如评论中指出的,垃圾收集器在移动数组数据时可能会在内存中留下杂散的数据副本。我认为这是特定于实现的--GC会清除所有的将要清除的数据,避免这种情况。即使是这样,还是会存在char [ ] 保存有password字段的时间可以被攻击。
14
+
13
15
14
16
** stackoverflow链接** :
15
17
http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords-in-java
18
+ ** 知乎上也有相关讨论** :
19
+ https://www.zhihu.com/question/36734157
You can’t perform that action at this time.
0 commit comments