我们已经知道此建议/做法是使用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?的重复 我知道故事是什么。我在这个特定的背景下问,它仍然有意义吗?
答案 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
是有道理的,因为你“没有让它变得更糟”。