Шифрование и дешифрование данных на стороне клиента с использованием cryptojs

#javascript #encryption #cryptography #cryptojs

#javascript #шифрование #криптография #cryptojs

Вопрос:

Я работаю над расширением Chrome, чтобы сохранить некоторые пользовательские данные в локальном хранилище. Я кодирую данные с помощью crypto-js. Однако я сталкиваюсь с одной незначительной проблемой / дилеммой — если я кодирую пользовательские данные с помощью секретного ключа abc123 , я получаю что-то вроде этого 2FsdGVkX19v0LNG0FKFv1SxAQj4AqdNvWWMGyi9yVI= . Однако, если я расшифрую его, используя другой секретный ключ, например abc , я получу пустую строку. Только правильный секретный ключ возвращает непустую строку.

Итак, мой вопрос, как мне нужно кодировать данные, если при декодировании с неправильным ключом он все равно вернет некоторую строку? Существует ли какая-либо конфигурация для этой или другой кодировки? Если я хакер и использую грубую силу для взлома данных, то выглядит довольно очевидно, какой секретный ключ пользователь использует для кодирования данных.

Fidller для настройки конфигурации.

Комментарии:

1. Вероятно, вы используете AES-CBC с дополнением PKCS # 7. Это означает, что примерно по крайней мере 1 из 16 случайных ключей будет выдавать случайный мусор вместо ничего. Это связано с тем, что иногда работают байты заполнения.

Ответ №1:

Поскольку вы используете Crypto.js вы ограничены популярными и проверенными в боях алгоритмами. Допустим, вы используете AES-256-CBC с ключом, полученным из пароля («abc123»).

Если вы шифруете что-то, что использует человек, то оно, вероятно, имеет низкую энтропию и, следовательно, некоторую структуру. Подумайте о некоторой строке JSON, которую вы шифруете. Если злоумышленник попытается расшифровать зашифрованный текст с помощью некоторого случайного ключа, они могут получить случайные байты. Если они знают, что им нужно вернуть JSON, у них есть оракул, сработало ли дешифрование. Они повторяют попытку с другим ключом и получают разные случайные байты. Они повторяют это до тех пор, пока не найдут открытый текст с допустимой структурой JSON. Даже если они не знают, что это JSON, они могут использовать статистические методы, чтобы определить, получили ли они правильный ключ.

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

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

Обычный способ усложнить задачу злоумышленнику — увеличить коэффициент работы. Crypto.js использует по умолчанию EVP_BytesToKey с одной итерацией MD5-хэша пароля для получения ключа. Эта операция выполняется довольно быстро. Вы могли бы изменить это на что-то вроде PBKDF2 с миллионом итераций, но современные компьютеры настолько быстры, что это не решает вашу проблему…

Основная проблема заключается в том, что ваш пароль слишком короткий. «abc123» — это пароль, который может быть взломан за миллисекунды при использовании Crypto.js значения по умолчанию (1xMD5) и, возможно, минуты при использовании PBKDF2 с миллионом итераций. Добавление одного символа к паролю увеличивает усилие грубой силы как минимум на 50 (в зависимости от класса: верхний, нижний, цифры, специальный).

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

Обратите внимание, что простое шифрование не решает всех ваших проблем. Обычно угроза все еще существует.

Ответ №2:

Вы можете расшифровать свои данные только с помощью ключа шифрования. Я лично не стал бы шифровать данные в интерфейсном приложении.

Возможно, вам следует взглянуть на документацию: https://cryptojs.gitbook.io/docs /

Комментарии:

1. На какую именно часть вы рекомендуете обратить внимание?