Шифрование пароля с помощью google/tink

Добрый день, я использовал google/tink для шифрования пароля для хранения в БД, выполнив следующие действия:

// 1. Generate the key material.
KeysetHandle keysetHandle = 
    KeysetHandle.generateNew(AeadKeyTemplates.AES128_GCM);

// 2. Get the primitive.
Aead aead = AeadFactory.getPrimitive(keysetHandle);

// 3. Use the primitive to encrypt a plaintext,
byte[] ciphertext = aead.encrypt(plaintext, aad);

В основном он преобразует пароль в байты, но когда я преобразовываю его в строку для хранения в БД, он сохраняет зашифрованный пароль в следующем формате: -�@~�k�D߶{׼�.

Но я хочу сохранить пароль в формате 11As7737Cs9ue9oo09, используя шифрование tink.

Есть ли способ сделать это?


person Manish Mehta    schedule 08.05.2018    source источник
comment
Смотрите тег. В правильно спроектированной безопасной системе не существует такой вещи, как шифрование паролей.   -  person user207421    schedule 08.05.2018
comment
Не шифровать пароли, когда злоумышленник получит БД, он также получит ключ шифрования. Простого использования хэш-функции недостаточно, и простое добавление соли мало что дает для повышения безопасности. Повторите HMAC со случайной солью в течение примерно 100 мс и сохраните соль с хэшем. Используйте такие функции, как PBKDF2, Rfc2898DeriveBytes, Argon2, password_hash, Bcrypt или аналогичные функции. Суть в том, чтобы заставить злоумышленника потратить значительное время на поиск паролей методом грубой силы.   -  person zaph    schedule 09.05.2018
comment
@zaph Спасибо за предложение, обязательно сделаю это   -  person Manish Mehta    schedule 09.05.2018


Ответы (2)


Маниш, возможно, ты не захочешь шифровать пароли. Вы хотите их хешировать. Tink пока не поддерживает хэширование паролей, но мы можем добавить поддержку, если будет достаточно интереса.

Не могли бы вы отправить запрос на добавление функции на https://github.com/google/tink/issues/new?

person Thai Duong    schedule 24.05.2018
comment
Привет, Тай, поддерживает ли Tink шифрование с открытым ключом (сервер-клиент)? - person MrDumb; 12.06.2019

Я согласен со всеми здесь, что вы НЕ ДОЛЖНЫ хранить пароли в открытом виде.

Однако, чтобы ответить на ваш вопрос, потому что я думаю, что это обычная проблема, когда вы получаете какой-то зашифрованный текст, а строка не читается. Скажем, вы хотите хранить данные без пароля в зашифрованном и читаемом виде. Вам нужно будет использовать Base64 для кодирования зашифрованного текста.

Когда вы извлекаете данные, закодированные в Base64, из базы данных, вам нужно будет декодировать строку в Base64, а затем запустить ее в процессе расшифровки. Опираясь на ваш пример,

String readable = new String(java.util.Base64.getEncoder().encode(cipherText));

byte[] bytesToDecrypt = java.util.Base64.getDecoder().decode(readable.getBytes());
person hitch.united    schedule 23.02.2019