Я получил очень умное обходное решение André , работающее в Objective-C с использованием SDK Firebase iOS:
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
FIROptions *secondaryAppOptions = [[FIROptions alloc] initWithContentsOfFile:plistPath];
[FIRApp configureWithName:@"Secondary" options:secondaryAppOptions];
FIRApp *secondaryApp = [FIRApp appNamed:@"Secondary"];
FIRAuth *secondaryAppAuth = [FIRAuth authWithApp:secondaryApp];
[secondaryAppAuth createUserWithEmail:user.email
password:user.password
completion:^(FIRUser * _Nullable user, NSError * _Nullable error) {
[secondaryAppAuth signOut:nil];
}];
Существует несколько способов управлять этим. Если можно выяснить способ сделать, чтобы пользователь обеспечил пароль для keystore, когда приложение запускает самый соответствующий путь, должен был бы зашифровать все значения с помощью ключа и сохранить этот ключ в keystore. Интерфейс командной строки к keystore при помощи keytool. Однако JSE имеет API, чтобы программно получить доступ к keystore также.
Если у Вас нет способности иметь пользователя, вручную обеспечивают, пароль к keystore на запуске (скажите для веб-приложения), один способ сделать это состоит в том, чтобы записать исключительно сложную стандартную программу путаницы, которая может запутать ключ и сохранить его в файле свойств также. Важные вещи помнить состоят в том, что путаница и deobfuscation логика должны быть много разделенный на уровни (мог включить скремблирование, кодирование, введение побочных символов и т.д. и т.д.), и должен самостоятельно иметь по крайней мере один ключ, который мог быть скрыт в других классах в использовании приложения не интуитивные имена. Это не полностью безопасный механизм, так как кто-то с декомпилятором и изрядным количеством времени и аналитики может все еще работать вокруг этого, но является единственным, которого я знаю, которых не требует, чтобы Вы ворвались в собственный компонент (т.е. не легко decompilable) код.
Вы храните хеш SHA1 пароля в Вашем файле свойств. Затем при проверке пользовательского пароля Вы хешируете их попытку входа в систему и удостоверяетесь, что два хеша соответствуют.
Это - код, который хеширует некоторые байты для Вас. Вы можете легко немецкие байты от Строки с помощью getBytes()
метод.
/**
* Returns the hash value of the given chars
*
* Uses the default hash algorithm described above
*
* @param in
* the byte[] to hash
* @return a byte[] of hashed values
*/
public static byte[] getHashedBytes(byte[] in)
{
MessageDigest msg;
try
{
msg = MessageDigest.getInstance(hashingAlgorithmUsed);
}
catch (NoSuchAlgorithmException e)
{
throw new AssertionError("Someone chose to use a hashing algorithm that doesn't exist. Epic fail, go change it in the Util file. SHA(1) or MD5");
}
msg.update(in);
return msg.digest();
}
Нет нет. Даже если Вы зашифруете его, то кто-то будет декомпилировать код, который дешифрует его.
Вы могли сделать файл раздельного имущества (вне банки) для паролей (или прямой пароль DB или или ключевой пароль) и не включать тот файл свойств с распределением. Или Вы смогли заставлять сервер только признать, что вход в систему от определенной машины так, чтобы спуфинг требовался бы.
Разве Вы не могли иметь контакта приложения сервер по https и загрузить пароль после аутентификации в некотором роде, конечно?
В дополнение к шифрованию паролей, как описано выше помещенного любые пароли в файле раздельного имущества и на развертывании пытаются дать этому файлу наиболее заблокированный вниз возможные полномочия.
Например, если Ваш Сервер приложений работает на Linux/Unix как root
затем сделайте файл свойств пароля принадлежавшим root
с 400/-r--------
полномочия.