Скройте UITabBar когда изменение Ориентации

Разделите password (a char[]) и salt (a byte[] - 8 байтов, выбранных с помощью SecureRandom, дают хорошую соль - которую не нужно хранить в секрете) с получатель внеполосный. Затем, чтобы получить хороший ключ из этой информации:

/* Derive the key, given password and salt. */
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

Магические числа (которые могут быть определены где-то как константы) 65536 и 256 - это счетчик итераций и размер ключа, соответственно.

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

Размер ключа может быть уменьшен до 128 бит, который все еще считается «сильным» шифрованием, но он не дает большой запас прочности, если обнаружены атаки, которые ослабляют AES.

При использовании с надлежащим режимом цепочки блоков один и тот же производный ключ может использоваться для шифрования многих сообщений. В Cipher Block Chaining (CBC) случайный вектор инициализации (IV) генерируется для каждого сообщения, давая различный зашифрованный текст, даже если обычный текст идентичен. CBC может быть не самым безопасным режимом, доступным для вас (см. AEAD ниже); Есть много других режимов с различными свойствами безопасности, но все они используют одинаковый случайный ввод. В любом случае выходные данные каждой операции шифрования представляют собой зашифрованный текст и вектор инициализации:

/* Encrypt the message. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
byte[] ciphertext = cipher.doFinal("Hello, World!".getBytes("UTF-8"));

Сохраняют ciphertext и iv. При расшифровке SecretKey регенерируется точно таким же образом, используя пароль с теми же параметрами соли и итерации. Инициализируйте шифр с этим ключом и вектор инициализации, сохраненный с сообщением:

/* Decrypt the message, given derived key and initialization vector. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
String plaintext = new String(cipher.doFinal(ciphertext), "UTF-8");
System.out.println(plaintext);

Java 7 включил поддержку API для режимов шифрования AEAD , и поставщик SunJCE, включенный в дистрибутивы OpenJDK и Oracle, реализует их, начиная с Java 8. Один из этих режимов настоятельно рекомендуется вместо CBC; это защитит целостность данных, а также их конфиденциальность.


A java.security.InvalidKeyException с сообщением «Недопустимый размер ключа или параметры по умолчанию» означает, что стойкость криптографии ограничена ; файлы политики неограниченной юрисдикции находятся не в правильном месте. В JDK их следует поместить в ${jdk}/jre/lib/security

На основании описания проблемы, похоже, что файлы политики установлены неправильно. Системы могут легко иметь несколько сред выполнения Java; перепроверьте, чтобы убедиться, что используется правильное местоположение.

7
задан Francescu 29 June 2009 в 08:00
поделиться

2 ответа

Вы можете использовать текущее решение в сочетании с:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

для обнаружения вращения. (Я думаю, вы объедините это с view.transform = CGAffineTransformMakeRotation, чтобы заставить его вращаться ...?)

3
ответ дан 7 December 2019 в 16:45
поделиться

Я думаю, вы можете легко это сделать двумя способами:

  1. перезагрузить объекты обратно в контроллер tabBar - с параметром hidesBottomBarWhenPushing, установленным в YES для viewControllers, которые вы хотите скрыть.
  2. Другой вариант - просто сделать ваш вид единственным видом для окна, когда телефон повернут, а затем вернуть tabBarController.view в окно, когда телефон повернут назад.

Надеюсь, это поможет

0
ответ дан 7 December 2019 в 16:45
поделиться