Тихо как-то в группе 😀 Предлагаю обсудить. Навеяно статьёй
https://habr.com/ru/post/423753/, где автор (
@NeonLost) писал, что пин нужно валидировать только на сервере. Думал, как можно проверять валидность пина локально на девайсе (для работы в оффлайн режиме, например), если будем шифровать данные ключём выведенным из пина, с помощью AES/CBC/
NoPadding.
Пришёл к такой схеме:
1. Когда пользователь создал пин, мы выводим из него ключ (назовём его PinKey)
2. В это же время генерим ключ в Android KeyStore - AES или RSA, что позволяет Api level (KeyStoreKey)
3. Генерим рандом байты (Challenge)
4. Шифруем Challenge с помощью PinKey (PinEncryptedChallenge) и KeyStoreKey (KeyStoreEncryptedChallenge) и сохраняем в префы
5. Когда надо проверить пин (CandidatePinKey) локально расшифровываем KeyStoreEncryptedChallenge с помошью KeyStoreKey и получаем эталон Challenge. Расшифровываем PinEncryptedChallenge с помощью PinCandidateKey и получаем candidateChallenge. Сравниваем с эталоном - совпало CandidatePin - OK. Нет - NotOK.
Так как Challenge не зашит в приложении, реверсом его не достать и пин не забрутфорсить.
Такие мысли. Рабочая ли схема, или что-то упустил? Может какие подводные камни заметили?