Как сгенерировать ключ Tink из предоставленного пользователем пароля

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

Кажется, мне нужен Aead, который я могу генерировать из KeysetHandle с AeadFactory.getPrimitive(keysetHandle), Но как я могу произвести KeysetHandle из "мастер-пароля"?

(И для контекста этого вопроса, получение этого ключа из систем управления ключами вместо того, чтобы производить его "из воздуха" из мастер-пароля, не вариант.)

1 ответ

Aead может быть создан следующим образом (здесь сделано из Scala):

val password: String = "..."
val aead = {
  val messageDigest = MessageDigest.getInstance("SHA-256")
  messageDigest.update(password.getBytes(CharsetNames.Utf8))
  val key256Bit = messageDigest.digest()
  val key128Bit = key256Bit.take(16)
  new AesGcmJce(key128Bit)
}

Несколько комментариев:

  • Я бы предпочел, чтобы ключ основывался на 32-битном дайджесте, но шифр, выбранный Tink в этом случае, выдает исключение, когда ему предоставляется 32-битный ключ, следовательно, сокращение до 16-битного ключа.
  • Кажется, что сокращение ключа таким образом нормально с точки зрения слабости хэша.
Другие вопросы по тегам