Функция Java Arrays.fill () выполняется преждевременно в основном потоке?

Blazing спросил: 28 апреля 2018 в 09:18 в: java

Этот код находится под кнопкой OnClickListner кнопки

String username = edtLabel.getText().toString():
char[] password = new char[edtPassword.getText().length()];
edtPassword.getText().getChars(0, edtPassword.getText().length(), password,0);new BackGroundTask(username, password).execute();
Arrays.fill(password, '0');

Проблема, с которой я столкнулась, заключается в том, что пароль, переданный конструктору BackGroundTask (класс AsyncTask), всегда представляет собой массив нулей то есть {0, 0, 0}. Хотя я вызываю функцию Arrays.fill () после настройки конструктора.

Код немного длиннее, чем данный фрагмент, проверяя несколько других вещей, но не изменяя пароль в любой момент времени.

Я часто искал везде, но не мог найти ничего. Единственное решение, которое я вижу, - это использование обработчика, который выполняется через несколько сотен миллисекунд, который заполняет пароли нулями.

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {        Arrays.fill(password, '0');
    }
 }, 100);

Любая лучшая и простая техника была бы великолепна, спасибо.


2 ответа

Есть решение
Eran ответил: 28 апреля 2018 в 09:49

Если конструктор BackGroundTask не должен изменять исходный массив password, вы можете передать копию этого массива с помощью Arrays.copyOf().

char[] pwCopy = Arrays.copyOf(password,password.length);
new BackGroundTask(username, pwCopy).execute();
Arrays.fill(password, '0');

EDIT: если цель состоит в том, чтобы удалить пароль из памяти после того, как вы закончите использовать его, я переместил бы вызов Arrays.fill(password, '0'); в конец метода (или конструктор) класса BackGroundTask, который использует массив password. В этом случае вам не нужно создавать копию массива.

Blazing ответил: 28 апреля 2018 в 09:25
Все, что я хочу, это отбросить пароль после его использования в этом LoginActivity
Eran ответил: 28 апреля 2018 в 09:27
@Blazing создание копии, как было предложено, решит вашу проблему. Альтернативой может быть вызов Arrays.fill в конце конструктора BackGroundTask (только если метод execute() не требует исходного содержимого этого массива).
Blazing ответил: 28 апреля 2018 в 09:44
это не решает проблему. PwCopy по-прежнему содержит пароль в памяти.
Eran ответил: 28 апреля 2018 в 09:46
@Blazing в этом случае, пусть потребитель этого пароля (конструктор BackGroundTask или BackGroundTask execute) заполнит массив 0s, как только он будет сделан, используя Это.
Blazing ответил: 28 апреля 2018 в 09:50
Оказывает ли это отпасть от массива паролей в LoginActivity? Я слышал, что java проходит по значению
Jyoti JK ответил: 28 апреля 2018 в 09:25

Вы можете попробовать

new BackGroundTask(username, password)
{
     @Override
     protected void onPostExecute(String result) {
           super.onPostExecute(result);
           Arrays.fill(password, '0');
     }}.execute();