Java存储密码用字符数组

字符数组和字符串都可以用于存储文本数据,但是在选择具体哪一种时,如果你没有针对具体的情况是很难回答这个问题的。但是任何与字符串相关的问题一定有线索可以在字符串的属性里面找到,比如不可变性。他就用这种方式去说服面试官。这里我们就来探讨一些关于为什么你应该使用char[] 来存储密码而不是字符串。

  • 因为字符串是不可变对象,如果作为普通文本存储密码,那么它会一直存在内存中直至被垃圾收集器回收。因为字符串从字符串池中取出的(如果池中有该字符串就直接从池中获取,否则new 一个出来,然后把它放入池中),这样有很大的机会长期保留在内存中,这样会引发安全问题。因为任何可以访问内存的人能以明码的方式把密码dump出来。另外你还应该始终以加密而不是普通的文本来表示密码。因为字符串是不可变,因此没有任何方法可以改变其内容,任何改变都将产生一个新的字符串,而如果使用char[],你就可以设置所有的元素为空或者为零(这里作者的意思是说,让认证完后该数组不再使用了,就可以用零或者null覆盖原来的密码,防止别人从内存中dump出来)。所以存储密码用字符数组可以明显的减轻密码被盗的危险。
  • Java官方本身也推荐字符数组,JpasswordField的方法getPassword()就是返回一个字符数组,而由于安全原因getText()方法是被废弃掉的,因为它返回一个纯文本字符串。跟随Java 团队的步伐吧,没有错。
  • 字符串以普通文本打印在在log文件或控制台中也易引起危险,但是如果使用数组你不能打印数组的内容,而是它的内存地址。尽管这不是它的真正原因,但仍值得注意。
String strPassword="Unknown";
char[] charPassword= new char[]{‘U‘,‘n‘,‘k‘,‘w‘,‘o‘,‘n‘};
System.out.println("String password: " + strPassword);
System.out.println("Character password: " + charPassword);

String password: Unknown
Character password: [[email protected]

以上所有就是为什么字符数组比字符串保存密码要好的原因,尽管使用char[]还不足以安全。我同样建议你用hash或者密码加密代替普通文本,而且一旦认证完成尽可能快的把他清除掉。

我是天王盖地虎的分割线                                                                 

参考:http://www.blogjava.net/hello-yun/archive/2013/11/05/406027.html

Java存储密码用字符数组

时间: 2024-10-24 07:48:50

Java存储密码用字符数组的相关文章

为什么存储密码字符数组比字符串更合适?

个人觉得此话很有道理:任何与字符串相关的问题一定可以从字符串的属性里面的线索中找到. 1.因为字符串是不可变对象,如果作为普通文本存储密码,那么它会一直存在内存中直至被垃圾收集器回收.因为字符串从字符串池中取出的(如果池中有该字符串就直接从池中获取,否则new 一个出来,然后把它放入池中),这样有很大的机会长期保留在内存中,这样会引发安全问题.因为任何可以访问内存的人能以明码的方式把密码dump出来.另外你还应该始终以加密而不是普通的文本来表示密码.因为字符串是不可变,因此没有任何方法可以改变其

Java 字符数组迷惑区-解惑

一直不太清楚Java 里面在申明字符数组的两种方式的应用场景,今天突然小弟顿悟,和大家分享.不对的地方和不足的地方还请大家多多指出. 第一种是:char[] ta = new char[1024];第二种是: char[] te = {'a','a','b'}; 深入解析这两者在运行时候JVM  他是怎么看的:首先当JVM  运行到char[] ta = new char[1024],我们都知道java里面的new 运算符是为该对象申请并分配内存的.那里这里有些童鞋可能会有疑问,字符数组怎么是一

java标准-密码用数组比用字符串安全

转载:http://my.oschina.net/jasonultimate/blog/166968 1) Since Strings are immutable in Java if you store password as plain text it will be available in memory until Garbage collector clears it and since String are used in String pool for reusability th

JAVA八种基本数据类型存储数值,字符和布尔值

把JAVA的知识点在回顾回顾,要不然都忘掉了. 基本数据类型:4类8种 整数型 byte    1      -128~127 short   2 int     4 long    8 浮点型 float   4 double  8 字符型 char    2 布尔型 boolean 1 内存空间不同 取值范围不同 byte 内存空间8 short  内存空间16 int     内存空间32 long     内存空间64 float    内存空间32 double    内存空间64 1

Java IO学习--(五)字节和字符数组

内容列表 从InputStream或者Reader中读入数组 从OutputStream或者Writer中写数组 在java中常用字节和字符数组在应用中临时存储数据.而这些数组又是通常的数据读取来源或者写入目的地.如果你需要在程序运行时需要大量读取文件里的内容,那么你也可以把一个文件加载到数组中.当然你可以通过直接指定索引来读取这些数组.但如果设计成为从InputStream或者Reader,而不是从数组中读取某些数据的话,你会用什么组件呢? 从 InputStream 或 Reader中读取数

使用字符数组保存密码, 比使用String保存密码更好

在Java 中, 使用字符数组保存密码 比使用String保存密码更好. 两点理由 : 很难从内存中清除. String 属于不可变对象, 他会被放到串缓冲池中以方便重复使用,所以它就可能在内存中被保留很长时间. 这时任何能够访问内存的人, 都可以很容易看到明文密码 当然, 根本就不应该使用明文密码 Java 提供 JPasswordField组件的getPassword()方法 这是特意为密码准备的, 不用吗? 不要偷懒 在你不知道的时刻, 可能被泄露到其他地方 比如日志中. 2018年5月

java 字符数组输出

很神奇吧 因为他们两个调用的方法不同 一般输出数组调用的是 : void java.io.PrintStream.println(Object x) 所以调用的是object 的toString()方法 然而输出字符数组时调用: void java.io.PrintStream.println(char[] x) java 字符数组输出,布布扣,bubuko.com

Java实现字符数组全排列

import org.junit.Test; public class AllSort { public void permutation(char[] buf, int start, int end) { if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可 for (int i = 0; i <= end; i++) { System.out.print(buf[i]); } System.out.println(); } else {//

java中将一个字符数组赋值给另一个,两者同时变化

java中将一个字符数组赋值给另一个,两者的变化怎么是同步的?怎么才能让他们独立开? 比如有一个int[][] a 已经存在值,现在定义int[][] b=a;之后改变a的值,为何b也跟着改变?怎么才能那个让b不跟随a改变?如果b非变不可,我想记录下a没改变之前的值该怎么办?谢谢 如果需要b不变,就必须用for循环,使a数组的每个元素都复制到b的数组里.之所以b会随着a变化,那是因为他们指向了同一个对象.