Java敏感数据:char [] vs String?有什么意义?

时间:2017-02-03 09:50:05

标签: java

我们已经知道此建议/做法是使用char[]代替String来处理敏感数据。这有多种原因。一种是在不再需要敏感数据后立即清理它们:

char[] passwd = passwordProvider.getKeyStorePassword();
KeyStore keystore = KeyStore.getInstance("JKS");

// TODO: Create the input stream;
keystore.load(inputstream, passwd);

System.arraycopy(new char[passwd.length], 0, passwd, 0, passwd.length);

// Please continue...

现在的问题是:当敏感数据最初为char[]值时,它(即使用String)是否有意义(特别是上述点)?例如:

char[] passwd = passwordProvider.getKeyStorePassword().toCharArray();
KeyStore keystore = KeyStore.getInstance("JKS");

// TODO: using the passwd, load the keystore;

System.arraycopy(new char[passwd.length], 0, passwd, 0, passwd.length);

// Please continue...

提前致谢。

UPDATE2:我会重新解释这个问题:在这个特定的环境中(忘记将来或其他任何事情的变化),“清除char数组的内容”这一行是否有用?

UPDATE1:它不是Why is char[] preferred over String for passwords?的重复 我知道故事是什么。我在这个特定的背景下问,它仍然有意义吗?

1 个答案:

答案 0 :(得分:4)

在我看来,在设计密码提供程序的API时,它返回######################################## package Trapper; ######################################## use Log::Log4perl qw(:easy); sub TIEHANDLE { my $class = shift; bless [], $class; } sub PRINT { my $self = shift; $Log::Log4perl::caller_depth++; DEBUG @_; $Log::Log4perl::caller_depth--; } 1; ######################################## package main; ######################################## use Log::Log4perl qw(:easy); Log::Log4perl->easy_init( {level => $DEBUG, file => 'stdout', # make sure not to use stderr here! layout => "%d %M: %m%n", }); tie *STDERR, "Trapper"; 是一个安全问题。

但是,如果您必须使用该API,则立即转换为String意味着您没有阻止char[]实例进行GC,因为你没有提到超过绝对必要的时间。

所以,在这里使用String是有道理的,因为你“没有让它变得更糟”。