Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit f756ffa

Browse filesBrowse files
committed
优化“为什么在java中存放密码更倾向于char[]而不是String”
1 parent fea342e commit f756ffa
Copy full SHA for f756ffa

File tree

Expand file treeCollapse file tree

1 file changed

+10
-6
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+10
-6
lines changed
+10-6Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
1-
## 为什么在java中存放密码更倾向于char[]相对于String
1+
## 为什么在java中存放密码更倾向于char[]而不是String
22

33
### 问题
44

5-
在Swing中,password字段有一个getPassword()方法(返回char[]),而不是通常的getText()方法(返回字符串)。同样的,我遇到一个建议不要使用字符串处理密码
6-
为什么在谈论passwords时,认为字符串会对安全构成威胁?感觉使用char[]不是那么的方便。
5+
在Swing中,password字段有一个getPassword()方法(返回char[]),而不是通常的getText()方法(返回String字符串)。同样的,我看到一个建议说不要使用字符串处理密码
6+
为什么在涉及passwords时,都说字符串会对安全构成威胁?感觉使用char[]不是那么的方便。
77

88
### 回答
9-
String是不可变的。这意味着,一旦你创建了一个String,如果另一个线程可以进行内存转存,在GC回收之前,没有办法可以摆脱数据(除了反射)。(这段翻译的不好,希望大家帮助改正)
10-
然而对于数组,你可以在使用完就明确的擦除它,你可以用任何你喜欢的数据覆盖这个数组,而且password不会出现在系统的任何地方,甚至在垃圾回收之前。
9+
String是不可变的。虽然String加载密码之后可以把这个变量扔掉,但是字符串并不会马上被GC回收,一但进程在GC执行到这个字符串之前被dump,dump出的的转储中就会含有这个明文的字符串。那如果我去“修改”这个字符串,比如把它赋一个新值,那么是不是就没有这个问题了?答案是否定的,因为String本身是不可修改的,任何基于String的修改函数都是返回一个新的字符串,原有的还会在内存里。
10+
11+
然而对于数组,你可以在抛弃它之前直接修改掉它里面的内容或者置为乱码,密码就不会存在了。但是如果你什么也不做直接交给gc的话,也会存在上面一样的问题。
12+
1113
所以,这是一个安全性的问题--但是,即使使用char[]也仅仅是降低了攻击者攻击的机会,而且仅仅对这种特定的攻击有效。
12-
编辑:正如评论中指出的,垃圾收集器在移动数组数据时可能会在内存中留下杂散的数据副本。我认为这是特定于实现的--GC会清除所有的将要清除的数据,避免这种情况。即使是这样,还是会存在char[]保存有password字段的时间可以被攻击。
14+
1315

1416
**stackoverflow链接**
1517
http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords-in-java
18+
**知乎上也有相关讨论**
19+
https://www.zhihu.com/question/36734157

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.