zoukankan      html  css  js  c++  java
  • 为什么 char 数组比 String 更适合存储密码?

    推荐阅读:5 个刁钻的 String 面试题!

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

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

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

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

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

    字符串:

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

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

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

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

    2)Java 本身建议使用 JPasswordFieldgetPassword() 方法,该方法返回一个 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

    推荐去我的博客阅读更多:

    1.Java JVM、集合、多线程、新特性系列教程

    2.Spring MVC、Spring Boot、Spring Cloud 系列教程

    3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

    4.Java、后端、架构、阿里巴巴等大厂最新面试题

    觉得不错,别忘了点赞+转发哦!

  • 相关阅读:
    生成token和获取token
    python异常处理
    获取文件路径
    批量导出和批量安装第三方模块
    python操作从数据库中获取数据的接口
    centos中开机时如何自启动samba服务器
    MSSQL 创建自定义异常
    MSSQL 生成拼音码
    MSSQL FOR MXL PATH 运用(转载)
    MSSQL旋转和反旋转的例子
  • 原文地址:https://www.cnblogs.com/javastack/p/13636853.html
Copyright © 2011-2022 走看看