5.6.2 Правила
При использовании шифрования необходимо соблюдать следующие правила:
При использовании технологий шифрования, таких как шифрование данных и проверка подлинности, необходимо явно указать режим шифрования и заполнение. В Android при разработке приложений для шифрования обычно используется класс Cipher из пакета java.crypto. Для использования класса Cipher сначала необходимо указать тип используемого шифрования. Это называется преобразованием, и оно может быть выполнено двумя способами:
В последнем случае режим шифрования и заполнение будут неявно установлены на значения по умолчанию, предоставляемые поставщиком услуг шифрования Android. Эти значения выбираются с учётом удобства использования и совместимости и могут не обеспечивать достаточную безопасность в некоторых случаях. Поэтому для обеспечения надлежащей защиты рекомендуется использовать первый способ указания преобразования, который явно определяет режим шифрования и заполнение.
При выборе алгоритма шифрования важно выбирать те, которые соответствуют определённым стандартам. Кроме того, если алгоритм допускает использование ключей разной длины, важно учитывать жизненный цикл всего продукта и выбирать длину ключа, которая обеспечит достаточный уровень безопасности. Также стоит учесть, что для некоторых режимов шифрования и методов заполнения существуют известные атаки. Выбор надёжного алгоритма является критически важным.
Использование слабых алгоритмов шифрования может привести к катастрофическим последствиям. Например, файлы, защищённые шифрованием для предотвращения несанкционированного доступа, могут фактически предоставлять лишь минимальную защиту и даже допускать несанкционированный доступ. С развитием технологий шифрования становится всё более важным выбирать алгоритм, способный обеспечить безопасность на протяжении всего срока эксплуатации приложения.
Стандарты шифрования различаются в зависимости от страны. Подробнее см. в таблице ниже (единицы измерения — биты).
Таблица 5.6-1 NIST (США) NIST SP800-57
| Алгоритм | Жизненный цикл | Симметричное шифрование | Асимметричное шифрование | Шифрование эллиптических кривых | HASH (цифровая подпись) | HASH (генерация случайных чисел) |
| --- | --- | --- | --- | --- | --- |
| ~2010 | 80 | 1024 | 160 | 160 | 160 |
| 2030 | 112 | 2048 | 224 | 224 | 160 |
| 2030 | 128 | 3072 | 256 | 256 | 160 |
Таблица 5.6-2 ECRYPT II (ЕС)
Алгоритм | Жизненный цикл | Симметричное шифрование | Асимметричное шифрование | Шифрование эллиптических кривых | HASH |
---|---|---|---|---|---|
2009~2012 | 80 | 1248 | 160 | 160 | |
2009~2020 | 96 | 1776 | 192 | 192 | |
2009~2030 | 112 | 2432 | 224 | 224 | |
2009~2040 | 128 | 3248 | 256 | 256 | |
2009~ | 256 | 15424 | 512 | 512 |
Таблица 5.6-3 CRYPTREC (Япония) CRYPTREC Список алгоритмов шифрования
Технология | Название |
---|---|
Открытое шифрование | Подпись |
Конфиденциальность | |
Общий ключ | |
Общее секретное шифрование | 64-битное блочное шифрование |
128-битное блочное шифрование | |
Потоковое шифрование | |
Хеш-функция | |
Режим использования шифрования | Режим зашифрованного текста |
Аутентифицированный режим зашифрованного текста | |
Код аутентификации сообщения | |
Аутентификация сущности |
Преимущество шифрования на основе пароля заключается в том, что нет необходимости управлять ключом шифрования. Однако хранение пароля на устройстве устраняет это преимущество. Хранение пароля на устройстве также создаёт риск несанкционированного доступа к другим приложениям, поэтому по соображениям безопасности хранение пароля на устройстве недопустимо.
При генерации ключа шифрования из пароля рекомендуется всегда использовать соль. Если вы предоставляете функции для разных пользователей на одном устройстве, рекомендуется использовать разные соли для каждого пользователя. Причина в том, что если вы используете простую хеш-функцию для генерации ключа без соли, можно легко восстановить пароль с помощью техники, называемой «радужной таблицей». Использование соли делает ключи, сгенерированные из одного и того же пароля, разными (разные хеш-значения), предотвращая использование радужных таблиц для поиска ключей.
Пример:
public final byte[] encrypt(final byte[] plain, final char[] password) {
byte[] encrypted = null;
try {
// *** POINT *** Explicitly specify the encryption mode and the padding.
// *** POINT *** Use strong encryption methods (specifically, technologies that meet the relevant criteria), including algorithms, block cipher modes, and padding modes.
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
// *** POINT *** When generating keys from passwords, use Salt.
SecretKey secretKey = generateKey(password, mSalt);
При генерации ключа шифрования на основе пароля необходимо выбрать количество повторений процесса хеширования («растяжение») во время генерации ключа. Важно выбрать достаточно большое число, чтобы обеспечить высокий уровень безопасности. Обычно 1 000 или больше повторений достаточно. Если ключ используется для защиты более ценных активов, рекомендуется выбрать 1 000 000 повторений или более. Поскольку процесс хеширования требует незначительных вычислительных ресурсов, злоумышленники могут легко провести атаку методом перебора. Таким образом, используя метод растяжения, который включает многократное повторение процесса хеширования, мы можем намеренно увеличить время, затрачиваемое на процесс, делая атаку методом перебора более дорогостоящей. Обратите внимание, что количество итераций также влияет на скорость обработки приложения, поэтому рекомендуется тщательно выбирать подходящее значение.
Пример:
private static final SecretKey generateKey(final char[] password, final byte[] salt) {
SecretKey secretKey = null;
PBEKeySpec keySpec = null;
(Omit)
// *** POINT *** When generating a key from password, use Salt.
// *** POINT *** When generating a key from password, specify an appropriate hash iteration count.
// *** POINT *** Use a key of length sufficient to guarantee the strength of encryption.
keySpec = new PBEKeySpec(password, salt, KEY_GEN_ITERATION_COUNT, KEY_LENGTH_BITS);
Сложность пароля, полученного от пользователя, сильно влияет на силу сгенерированного ключа шифрования. Поэтому рекомендуется принимать меры для усиления паролей, полученных от пользователей. Например, можно потребовать, чтобы пароль был не менее 8 символов и содержал различные типы символов — возможно, хотя бы одну букву, одну цифру и один специальный символ.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )