Разбираемся с зашифрованными паролями Parse.com при переезде на другой сервер

Сегодня я хочу рассказать про решение одной проблемы с переходом от Parse.com на Firebase (или другой сервер).

Те разработчики, которые использовали или используют Parse авторизацию в своих приложениях знают, что пароли пользователей хранятся в зашифрованном виде. Это значит, что для самого разработчика пароль пользователя — это тайна.

Конечно это очень важно в плане безопасности, но всё же с этим связана проблема, которая возникает у разработчиков во время переезда с Parse.com, так как этот сервис закрывается.

Кто работает с Firebase знает, что данные там хранятся в формате json. В связи с этим доступен импорт json файлов. В Parse.com так же есть замечательная опция — экспорт данных (в настройках приложения). При нажатии кнопки экспорта на почту отправляется архив со всеми данными приложения в формате json.

И именно здесь есть небольшая проблема. Все поля, как и ожидается, содержут в себе действительные значения. Но вот пароль зашифрован.

Немного покопавшись в документации сервиса, можно обнаружить, что для шифрования используется bcrypt. Но как понять приложению — совпадает ли пароль с зашифрованным или нет?

На просторах интернета можно найти несколько полезных ресурсов для проверки bcrypt и информацию по самому bcrypt. Я приведу их здесь:

1)http://stackoverflow.com/questions/5881169/what-column-type-length-should-i-use-for-storing-a-bcrypt-hashed-password-in-a-d/5882472#5882472 — в этом ответе чётко расписано, что же означает зашифрованный пароль bcrypt

2)https://www.dailycred.com/article/bcrypt-calculator — калькулятор для генерации хэшей определённого порядка и проверки совпадения пароля и ранее сгенерированного хэша (строки отличаются даже у одного пароля)

3)http://bcrypthashgenerator.apphb.com/— генерация bcrypt хэша

4)https://www.bcrypt-generator.com/ — ещё один генератор

Остаётся открытым один вопрос — как можно проверить совпадает-ли хэш, хранящийся в json данных нашего хранилища и сгенерированный хэш от введённого пароля пользователя.

Чтобы реализовать такую проверку мы будем использовать библиотеку jBcrypt (есть аналоги для других языков).

import org.mindrot.jbcrypt.BCrypt;
public class Main {
public static void main(String[] args) {
String candidateParseCom =
“$2a$08$osg6o7pLGfsJryTLeZY2O.8iXC2RErtvd598tcCJKoc8I3l5Amj3S”;
String password = “123”;
if (BCrypt.checkpw(password, candidateParseCom)) {
System.out.println(“It matches”);
}
else {
System.out.println(“It does not match”);
}
}
}

Любая дополнительная информация находится в документации к этой библиотеки.

В данном примере мы получаем ввод пароля пользователя и сравниваем с зашифрованными данными json (от поля пароля parse.com). Если данный пароль, при хэшировании даёт аналогичный, по меркам bcrypt, результат — то можем пускать пользователя дальше.

Надеюсь это кому нибудь поможет.

С уважением.

Блог автора (теперь и на русском языке): http://junior-freelancer-ru.weebly.com/

Сообщество в VK (агрегатор новостей): https://vk.com/about_android_world
Статьи в Medium: https://medium.com/@skidanolegs