为了账号安全,请及时绑定邮箱和手机立即绑定

为什么char []比字符串更适合密码?

为什么char []比字符串更适合密码?

为什么char []比字符串更适合密码?在Swing中,密码字段具有getPassword()(返回char[])方法而不是通常getText()(返回String)方法。同样,我遇到了一个不使用String来处理密码的建议。String在密码方面,为什么会对安全构成威胁?使用感觉不方便char[]。
查看完整描述

4 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

虽然这里的其他建议似乎有效,但还有另一个好的理由。简单地说,String你不小心将密码打印到日志,监视器或其他一些不安全的地方。char[]不那么脆弱了。


考虑一下:


public static void main(String[] args) {

    Object pw = "Password";

    System.out.println("String: " + pw);


    pw = "Password".toCharArray();

    System.out.println("Array: " + pw);

}

打印:


String: Password

Array: [C@5829428e


查看完整回答
反对 回复 2019-05-27
?
白板的微信

TA贡献1883条经验 获得超3个赞

引用官方文档时,Java Cryptography Architecture指南说明了这char[]String密码(关于基于密码的加密,但当然更常见的是关于密码):

在类型的对象中收集和存储密码似乎是合乎逻辑的java.lang.String。但是,这里有一点需要注意:Object类型的s String是不可变的,即没有定义的方法允许你改变(覆盖)或清除String 后用法的内容。此功能使String对象不适合存储安全敏感信息,如用户密码。您应该始终在char数组中收集和存储安全敏感信息 。

Java编程语言安全编码指南的准则2-2,版本4.0也说了类似的东西(虽然它最初是在日志记录的上下文中):

准则2-2:不要记录高度敏感的信息

某些信息(如社会安全号码(SSN)和密码)非常敏感。即使是管理员,也不应将此信息保存的时间超过必要的时间,也不应保存在何处。例如,它不应该发送到日志文件,并且不应通过搜索检测到它的存在。一些瞬态数据可以保存在可变数据结构中,例如char数组,并在使用后立即清除。清除数据结构降低了典型Java运行时系统的有效性,因为对象在内存中透明地移动到程序员。

本指南还对低级库的实现和使用有影响,这些低级库没有他们正在处理的数据的语义知识。例如,低级字符串解析库可以记录它所处理的文本。应用程序可以使用库解析SSN。这会产生一种情况,即管理员可以使用SSN访问日志文件。


查看完整回答
反对 回复 2019-05-27
?
HUX布斯

TA贡献1876条经验 获得超6个赞

char[]通过将每个字符设置为零而不将字符串设置为零,可以在使用后清除字符数组()。如果某人可以以某种方式查看内存映像,如果使用字符串,他们可以以纯文本形式查看密码,但如果char[]使用,则在使用0清除数据后,密码是安全的。


查看完整回答
反对 回复 2019-05-27
  • 4 回答
  • 0 关注
  • 1445 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信