Я заинтересован в создании небольшого приложения для личного пользования, которое будет шифровать и дешифровать информацию на стороне клиента с помощью JavaScript. Зашифрованная информация будет храниться в базе данных на сервере, но никогда не будет расшифрована.
Это не должно быть супер-надёжно, но я бы хотел использовать в настоящее время непрерывный алгоритм.
В идеале я бы мог сделать что-то вроде
var gibberish = encrypt(string, salt, key);
генерировать закодированную строку и что-то вроде
var sensical = decrypt(gibberish, key);
расшифровать его позже.
До сих пор я видел это: http://bitwiseshiftleft.github.io/sjcl/
Какие-нибудь другие библиотеки мне нужно посмотреть?
encryption
javascript
Иеремии
источник
источник
Ответы:
источник
Как насчет CryptoJS ?
Это надежная крипто библиотека, с большим количеством функций. Он реализует хэши, HMAC, PBKDF2 и шифры. В этом случае шифры - это то, что вам нужно. Проверьте быстрый старт на домашней странице проекта.
Вы могли бы сделать что-то вроде с AES:
Что касается безопасности, на момент написания моей статьи алгоритм AES считается не нарушенным
Редактировать :
Кажется, что онлайн-адрес не работает, и вы можете использовать загруженные файлы для шифрования по указанной ниже ссылке и поместить соответствующие файлы в корневую папку приложения.
https://code.google.com/archive/p/crypto-js/downloads
или использовал другой CDN, например https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes-min.js
источник
Я создал небезопасную, но простую утилиту для шифрования и дешифрования текста. Нет зависимостей с какой-либо внешней библиотекой.
Это функции
И вы можете использовать их следующим образом:
источник
let
. JohnСуществующие ответы, в которых используются SJCL, CryptoJS и / или WebCrypto, не обязательно ошибочны, но они не так безопасны, как вы могли изначально подозревать. Как правило, вы хотите использовать libsodium . Сначала я объясню почему, а затем как.
Почему не SJCL, CryptoJS, WebCrypto и т. Д.?
Краткий ответ: для того, чтобы ваше шифрование было действительно безопасным, эти библиотеки ожидают, что вы сделаете слишком много вариантов, например, режим блочного шифра (CBC, CTR, GCM; если вы не можете сказать, какой из трех перечисленных мною безопасен для использовать и при каких ограничениях вы не должны быть обременены таким выбором вообще ).
Если ваша должность не является инженером-криптографистом , вероятность того, что она будет надежно реализована, зависит от вас.
Зачем избегать CryptoJS?
CryptoJS предлагает несколько строительных блоков и ожидает, что вы знаете, как их безопасно использовать. Это даже по умолчанию в режиме CBC (в архиве ).
Почему режим CBC плох?
Прочтите эту статью об уязвимостях AES-CBC .
Зачем избегать WebCrypto?
WebCrypto - это стандарт безопасности, разработанный комитетом для целей, которые ортогональны разработке криптографии. В частности, WebCrypto должен был заменить Flash, а не обеспечивать безопасность .
Зачем избегать SJCL?
Публичный API и документация SJCL просят пользователей зашифровать данные с помощью запоминаемого человеком пароля. Это редко, если вообще, то, что вы хотите делать в реальном мире.
Дополнительно: стандартное количество раундов PBKDF2 по умолчанию примерно в 86 раз меньше, чем вы хотите . AES-128-CCM, вероятно, в порядке.
Из трех приведенных выше вариантов SJCL наименее вероятно закончится слезами. Но есть и лучшие варианты.
Почему Libsodium лучше?
Вам не нужно выбирать между меню режимов шифрования, хэш-функциями и другими ненужными опциями. Вы никогда не рискуете испортить ваши параметры и удалить всю безопасность из вашего протокола .
Вместо этого libsodium предлагает простые настройки, настроенные на максимальную безопасность и минималистичные API.
crypto_box()
/crypto_box_open()
предложить аутентифицированное шифрование с открытым ключом.crypto_secretbox()
/crypto_secretbox_open()
предложить шифрование с аутентификацией с общим ключом.Кроме того, у libsodium есть привязки на десятках популярных языков программирования , поэтому очень вероятно, что libsodium просто сработает при попытке взаимодействия с другим стеком программирования. Кроме того, libsodium имеет тенденцию быть очень быстрым, не жертвуя безопасностью.
Как использовать Libsodium в JavaScript?
Во-первых, вам нужно решить одну вещь:
Если вы выбрали первый вариант , получите CipherSweet.js .
Документация доступна онлайн .
EncryptedField
этого достаточно для большинства случаев использования, но APIEncryptedRow
иEncryptedMultiRows
API могут быть проще, если у вас есть много различных полей, которые вы хотите зашифровать.С CipherSweet вам даже не нужно знать, что такое nonce / IV, чтобы безопасно его использовать.
Кроме того, это обрабатывает
int
/float
шифрует без утечки фактов о содержимом через размер зашифрованного текста.В противном случае вы захотите натрия-плюс , который является удобным интерфейсом для различных оболочек libsodium. Sodium-Plus позволяет писать производительный, асинхронный, кроссплатформенный код, который легко проверять и анализировать.
Чтобы установить натрий-плюс, просто запустите ...
В настоящее время нет общедоступной CDN для поддержки браузера. Это скоро изменится. Тем не менее, вы можете получить
sodium-plus.min.js
из последней версии Github , если вам это нужно.Документация для натрия-плюс доступна на Github.
Если вы хотите пошаговое руководство, эта статья содержит то, что вы ищете.
источник
Современные браузеры теперь поддерживают
crypto.subtle
API, который предоставляет собственные функции шифрования и дешифрования (не менее асинхронно!) С использованием одного из следующих методов: AES-CBC, AES-CTR, AES-GCM или RSA-OAEP.https://www.w3.org/TR/WebCryptoAPI/#dfn-Crypto
источник
Прежде чем реализовать что-либо из этого, ознакомьтесь с ответом Скотта Аркишевского .
Я хочу, чтобы вы были очень осторожны с тем, чем я собираюсь поделиться, поскольку у меня мало или совсем нет знаний по безопасности (есть большая вероятность, что я неправильно использую API ниже), поэтому я буду более чем рад обновить этот ответ с помощью сообщества .
Как упомянул в своем ответе @richardtallent , есть поддержка Web Crypto API, поэтому в этом примере используется стандарт. На момент написания этой статьи 95,88% глобальной поддержки браузеров .
Я собираюсь поделиться примером с использованием Web Crypto API
Прежде чем мы продолжим, пожалуйста, обратите внимание ( цитата из MDN ):
Я очень уважаю безопасность, и я даже выделил дополнительные детали из MDN ... Вы были предупреждены
сейчас, к фактическому примеру ...
JSFiddle:
Найдено здесь: https://jsfiddle.net/superjose/rm4e0gqa/5/
Примечание:
Обратите внимание на использование
await
ключевых слов. Используйте его внутриasync
функции или используйте.then()
и.catch()
.Сгенерируйте ключ:
Шифрование:
Расшифровать
Преобразование ArrayBuffer туда и обратно из строки (сделано в TypeScript):
Вы можете найти больше примеров здесь (я не владелец): // https://github.com/diafygi/webcrypto-examples
источник
CryptoJS больше не поддерживается. Если вы хотите продолжить использовать его, вы можете переключиться на этот URL:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
источник
Используйте SimpleCrypto
Использование encrypt () и decrypt ()
источник
Простые функции,
источник