Как сгенерировать ключ 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-битного ключа.
- Кажется, что сокращение ключа таким образом нормально с точки зрения слабости хэша.