另一个基于 String 的棘手 Java 问题,相信我只有很少的 Java 程序员可以正确回答这个问题。

这是一个真正艰难的核心 Java 面试问题,并且需要对 String 的扎实知识才能回答这个问题。

这是最近在 Java 面试中向我的一位朋友询问的问题。

他正在接受技术主管职位的面试,并且有超过6年的经验。如果你还没有遇到过这种情况,那么字符数组和字符串可以用来存储文本数据,但是选择一个而不是另一个很难。

但正如我的朋友所说,任何与 String 相关的问题都必须对字符串的特殊属性有一些线索,比如不变性,他用它来说服访提问的人。在这里,我们将探讨为什么你应该使用char[]存储密码而不是String的一些原因。

字符串:

1)由于字符串在 Java 中是不可变的,如果你将密码存储为纯文本,它将在内存中可用,直到垃圾收集器清除它,并且为了可重用性,会存在 String 在字符串池中, 它很可能会保留在内存中持续很长时间,从而构成安全威胁。

由于任何有权访问内存转储的人都可以以明文形式找到密码,这是另一个原因,你应该始终使用加密密码而不是纯文本。

由于字符串是不可变的,所以不能更改字符串的内容,因为任何更改都会产生新的字符串,而如果你使用char[],你就可以将所有元素设置为空白或零。

因此,在字符数组中存储密码可以明显降低窃取密码的安全风险。

2)Java 本身建议使用 JPasswordField 的 getPassword() 方法,该方法返回一个 char[] 和不推荐使用的getTex() 方法,该方法以明文形式返回密码,由于安全原因。应遵循 Java 团队的建议, 坚持标准而不是反对它。

3)使用 String 时,总是存在在日志文件或控制台中打印纯文本的风险,但如果使用 Array,则不会打印数组的内容而是打印其内存位置。虽然不是一个真正的原因,但仍然有道理。

String strPassword =“Unknown”;
char [] charPassword = new char [] {'U','n','k','w','o','n'};
System.out.println(“字符密码:”+ strPassword);
System.out.println(“字符密码:”+ charPassword);

输出

字符串密码:Unknown  
字符密码:[C @110b053

我还建议使用散列或加密的密码而不是纯文本,并在验证完成后立即从内存中清除它。

因此,在Java中,用字符数组用存储密码比字符串是更好的选择。

虽然仅使用char[]还不够,还你需要擦除内容才能更安全。

版本申明:本作品系作者 Yujiaao 原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议,来源:segmentfault.com/a/1190000019962661

为什么 char 数组比 String 更适合存储密码?相关推荐

  1. wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString....转换

    wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString.... #include <strin ...

  2. wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString 以及system(command)...

    转载:http://blog.csdn.net/chocolateconanlan/article/details/4058868 wchar_t*,wchar_t,wchat_t数组,char,ch ...

  3. 在Java中将字符串转换为char数组,将char数组转换为String

    Today we will learn how to convert String to a char array and then char array to String in Java. 今天, ...

  4. [C++]char转换为string ,固定长度的char数组转换为string

    char转换为string 固定长度的char数组转换为string 使用socket编程时候,需要将受到的字符串数组转换为string,但是转换后的字符串总会附加一些,转义字符. 直接上code c ...

  5. 【从零开始学c++】4.char数组和string的千丝万缕

    目录 1.char数组: char的赋值方法: char数组的赋值方法: ASCLL码: char类函数:需包含头文件 2.stirng: 3.对char数组的输入: 1.cin: 2.cin.etl ...

  6. delphi64位 char数组转换string中文乱码_使用位运算、值交换等方式反转java字符串-共四种方法...

    在本文中,我们将向您展示几种在Java中将String类型的字符串字母倒序的几种方法. StringBuilder(str).reverse() char[]循环与值交换 byte循环与值交换 apa ...

  7. java char数组转string数组_Java中char数组(字符数组)与字符串String类型的转换方法...

    本文实例讲述了Java中char数组(字符数组)与字符串String类型的转换方法.分享给大家供大家参考,具体如下: 在Java语言编程时,使用"口令字段"jPasswordFie ...

  8. 链表!比数组更适合做增删操作的数据结构

    什么是链表? 链表和数组的对比:在大多数语言中,数组的大小是固定的,从数组的起点或中间添加或删除元素的成本很高,因为需要移动元素. 链表中的每一个元素在内存中不是连续放置的,和它左右两侧元素是没有关系 ...

  9. Java char转换为String,String转换为char数组

    Today we will look into java char to String program. We will also learn how to convert String to a c ...

最新文章

  1. mysql数据定义语句有哪些_MySQL语法一:数据定义语句 钓鱼翁
  2. ​谷歌大神Jeff Dean领衔,万字展望5大AI趋势
  3. Alt + sysrq + REISUB doesn't reboot my laptop
  4. 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译
  5. 单选按钮设置为被选中状态_为什么要设置错误的按钮状态
  6. P7115-[NOIP2020]移球游戏【构造】
  7. Tomcat 的目录结构
  8. PHP 如何判断当前用户已在别处登录
  9. 德媒看2019年的世界:西方在争吵,中国在崛起,非洲在增长……
  10. 【CCCC】L3-002 特殊堆栈 (30分),nlogn维护序列中位数,STL大乱斗,有重multiset,vector+二分插入
  11. 自从有了计算机和网络才有信息技术,2015年信息技术会考模拟选择题6(俞同明版)...
  12. idea重写接口没有@override_1.重载和重写的区别
  13. 纸壳cms php,纸壳CMS 3.4 发布,电商功能增强
  14. Z-TEKCE COM控制线驱动
  15. python生成树状图_使用python的分层聚类树状图
  16. VMware安裝Ubuntu 16.04.4-server服务器版
  17. Comparable的compareTo
  18. 互联网+智慧环保建设需求
  19. 无胁科技-TVD每日漏洞情报-2022-7-30
  20. 分治法解决计算凸包问题

热门文章

  1. 你为什么薪水那么低(二)之 生产力
  2. Hadoop Streaming
  3. LeetCode每日一题:N叉树的层序遍历(No.429)
  4. Linux Centos7 下安装Mysql - 8.0.15
  5. 是什么优化让 .NET Core 性能飙升?
  6. 支付宝红包强攻微信社交,臆想出来的豪门恩怨
  7. 互联网协议入门(一)
  8. python入门基础教程02 Python简介
  9. Java Date 日期 时间 相关方法
  10. ClassLoader 初步