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

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

我是天王盖地虎的分割线                    




本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3881592.html,如需转载请自行联系原作者

Java存储密码用字符数组相关推荐

  1. Java IO: 字节和字符数组

    转载自   Java IO: 字节和字符数组 译文链接  作者: Jakob Jenkov   译者:homesick 内容列表 从InputStream或者Reader中读入数组 从OutputSt ...

  2. Java 将字符串转换为字符数组 toCharArray()

    Java 手册 toCharArray public char[] toCharArray() 将此字符串转换为一个新的字符数组. 返回: 一个新分配的字符数组,它的长度是此字符串的长度,它的内容被初 ...

  3. java存储整数_关于数组:Java:存储大量整数的最佳数据类型是什么?

    我必须处理大量的小整数,最大为1700万(值始终在0-255之间),并将它们存储在某种类型的数组上,我目前使用的是普通的int数组,并且性能不是最好的( 符合预期). 每次执行时,程序都会访问该数组的 ...

  4. Java字符串转换成字符数组

    方法1 package com.oracle;import java.util.Scanner;public class Test {/*** @param args*/public static v ...

  5. java char数组查找_我爱java系列---【在字符数组中查询某个字符串是否存在】

    mysql中的FIND_IN_SET函数 需求:根据省份id,查询可以在该省份下发信息的通道id sql语句: SELECT cpa.CHANNEL_ID id FROM channel_price_ ...

  6. C语言学习笔记---结构体中的字符数组和字符指针

      在结构体中可以使用字符数组来存储字符串,也可以使用字符指针来存储字符串.比如: struct str{char s1[5];char s2[5];};struct str str1= {" ...

  7. 十六进制转字符串或char字符数组

    文章目录 十六进制-字符串互转 十六进制转字符数组 十六进制-字符串互转 HEX-字符互转 https://the-x.cn/encodings/Hex.aspx 注意:必须是可打印字符才能在这里互转 ...

  8. c 语言求字符数组长度,C/C++中获取数组长度的方法示例

    学过C/C++的人都知道,在C/C++中并没有提供直接获取数组长度的函数,对于存放字符串的字符数组提供了一个strlen函数获取其长度,那么对于其他类型的数组如何获取他们的长度呢? 其中一种方法是使用 ...

  9. python定义字符串数组初始化_字符数组及其定义和初始化,C语言字符数组详解...

    字符数组及其定义和初始化,C语言字符数组详解 字符串的存储方式有字符数组和字符指针,我们先来看看字符数组. 因为字符串是由多个字符组成的序列,所以要想存储一个字符串,可以先把它拆成一个个字符,然后分别 ...

最新文章

  1. linux 学习总结
  2. 我的世界服务器修改飞行速度,《我的世界》创造模式飞行速度修改方法介绍
  3. 一维OTSU法、最小交叉熵法、二维OTSU法及C++源码
  4. matlab中的[~,m]=size(coord)是什么意思
  5. 使用fetch函数发送ajax
  6. C#特性 学习笔记(对象初始化器 匿名类型 扩展方法)
  7. 3-8 堆栈模拟队列 (25 分)
  8. JDBC学习(八、获取自动生成的主键和大数据类型操作)
  9. 深度学习图像分割(一)——PASCAL-VOC2012数据集(vocdevkit、Vocbenchmark_release)详细介绍
  10. 苹果ttc转ttf_iOS使用自定义字体的方法(内置和任意下载ttf\otf\ttc字体文件)
  11. dsp+c语言字符串,DSP中常用的C语言关键字
  12. uniapp个人中心界面模板
  13. 联想笔记本电源管理-设置充电上下限
  14. 中高端时代趁势而来,本就艰难的酒店企业如何顺势而为
  15. DNA序列编码中Hairpin的定义和计算
  16. Spring Boot 解决同名类导致的bean名冲突bean name conflicts
  17. 题目: 有 n个人围成一圈,顺序排号。从第一个人开始报数(从 1到 3报数),凡报到 3的 人退出圈子,问最后留下的是原来第几号的那位。(模拟)
  18. 自动缩放文字的TextView
  19. 高铁动车入库 铁警携犬巡逻检查
  20. 驾考宝典科目一2015免费版

热门文章

  1. 数字谋定农村建设-农业大健康·万祥军:农业人工智能应用
  2. Jenkins部署:The username and password you provided are not correct (error 401)
  3. MyBatis源码解析(二)——Environment环境
  4. Codeforces Round #355 (Div. 2) D. Vanya and Treasure dp+分块
  5. [html] marquee详解
  6. 手把手演示:如何规划一个企业级数据中台
  7. 万字干货 | 滴滴顺风车事业部总经理:忘掉产品,专注用户(附下载)
  8. 如何做好新一年的产品规划?
  9. 微信环境中如何实现下载apk文件的下载
  10. Centos新建系统用户详解