Я думаю, у jbx есть хороший ответ.Если у злоумышленника есть доступ к вашей основной памяти, у вас, вероятно, больше проблем, чем беспокоиться о случайной строке пароля в памяти.Беспокойство также по поводу кэша L3 кажется довольно перегруженным.
Но в интересах кода я укажу, что хотя создание массива volatile
не поможет, почти любая другая форма синхронизации поможет.Все они имеют семантику, которая требует, чтобы все записи были сделаны видимыми.Таким образом, вы можете гарантировать, что изменения в массиве видны.
public class Password {
private final char[] password;
public Password( char[] p ) {
password = Arrays.copy( p, p.length );
}
public synchronized boolean compare( char[] p ) {
return Arrays.equal( password, p );
}
public synchronized clear() {
Arrays.fill(password, 42 );
}
}
Код не был протестирован.
Здесь я использую synchronized
просто для обеспечения видимости памяти.Атомность является лишь побочным эффектом и, вероятно, не нужна.