WebCrypto
Проблемы криптографии в клиентском (браузерном) javascript подробно описаны ниже. Все эти проблемы, кроме одной, не относятся к API WebCrypto , который в настоящее время достаточно хорошо поддерживается .
Для автономного приложения вы все равно должны разработать и внедрить безопасное хранилище ключей.
В сторону: если вы используете Node.js, используйте встроенный криптографический API.
Нативная JavaScript-криптография (до WebCrypto)
Я предполагаю, что основной проблемой является кто-то с физическим доступом к компьютеру, который читает localStorage
ваш сайт, и вы хотите, чтобы криптография помогла предотвратить такой доступ.
Если у кого-то есть физический доступ, вы также открыты для других атак и хуже, чем чтение. К ним относятся (но не ограничиваются ими): клавиатурные шпионы, автономная модификация скриптов, локальная инъекция скриптов, отравление кэша браузера и перенаправления DNS. Эти атаки работают, только если пользователь использует компьютер после того, как он был взломан. Тем не менее, физический доступ в таком сценарии означает, что у вас есть большие проблемы.
Так что имейте в виду, что ограниченный сценарий, в котором локальная криптография будет полезна, будет в случае кражи машины.
Существуют библиотеки, которые реализуют желаемую функциональность, например Stanford Javascript Crypto Library . Хотя есть и слабые места (как указано в ссылке из ответа @ ircmaxell):
- Отсутствие энтропии / генерации случайных чисел;
- Отсутствие безопасного хранилища ключей, то есть закрытый ключ должен быть защищен паролем, если он хранится локально или хранится на сервере (что запрещает автономный доступ);
- Отсутствие безопасного стирания;
- Отсутствие временных характеристик.
Каждый из этих недостатков соответствует категории криптографического компромисса. Другими словами, хотя у вас может быть «crypto» по имени, оно будет намного ниже строгости, к которой вы стремитесь на практике.
При всем этом, актуарная оценка не так тривиальна, как «криптография Javascript слабая, не используйте ее». Это не одобрение, а строгое предостережение, и оно требует от вас полного понимания подверженности вышеперечисленным недостаткам, частоты и стоимости векторов, с которыми вы сталкиваетесь, и вашей способности к смягчению или страхованию на случай неудачи: Javascript crypto, in несмотря на свои слабые стороны, может снизить вашу подверженность, но только против воров с ограниченными техническими возможностями. Однако вы должны предположить, что криптография Javascript не имеет никакого значения для решительного и способного злоумышленника, который нацеливается на эту информацию. Некоторые сочли бы неправильным называть данные «зашифрованными», когда известно, что так много недостатков присуще реализации. Другими словами, Вы можете незначительно уменьшить свою техническую подверженность, но вы увеличиваете свою финансовую подверженность раскрытию. Разумеется, каждая ситуация индивидуальна - и анализ снижения технической подверженности финансовому риску нетривиален. Вот наглядная аналогия:Некоторые банки требуют слабых паролей , несмотря на свойственный риск, потому что их подверженность потерям из-за слабых паролей меньше, чем затраты конечных пользователей на поддержку надежных паролей.
🔥 Если вы прочитали последний абзац и подумали: «Какой-то парень в Интернете по имени Брайан говорит, что я могу использовать криптографию Javascript», не используйте криптографию Javascript.
В случае использования, описанном в этом вопросе, пользователям, видимо, более целесообразно зашифровать свой локальный раздел или домашний каталог и использовать надежный пароль. Этот тип безопасности, как правило, хорошо проверен, широко доверен и общедоступен.