
Недавно я написал мобильное приложение для отслеживания запасов. Инвентаризация содержит около 1000 записей, и приложение только считывает данные. Я решил хранить данные в формате JSON и размещать их в корзине AWS S3. Это позволяет просто загрузить файл, используя общедоступный URL-адрес S3.
Меня не волнует, скачает ли файл кто-то другой, поэтому мне не нужна аутентификация, но я хочу сохранить содержимое в секрете, поэтому я его зашифровал. Парольная фраза где-то включена в программу, но пользователь должен ввести PIN-код, чтобы завершить кодовую фразу шифрования. Поскольку файл получен через https, это сохраняет данные в секрете до тех пор, пока они не будут расшифрованы в приложении. Файл не должен храниться в незашифрованном виде в приложении.
Я использую команду openssl для шифрования перед загрузкой в AWS. Я использую компонент FileSystem в Expo, чтобы загрузить файл в свое приложение React Native. Затем зашифрованный файл считывается, расшифровывается и анализируется для создания объекта JSON. Приложение просто отображает JSON в длинном списке.
Нам нужен модуль NPM для React Native, который расшифровывает данные, зашифрованные openssl. Модуль crypto-js NPM используется в большинстве программ NodeJS, но не работает в React Native. Требуется чистая реализация JavaScript. К счастью, некоторые хорошие люди повторно реализовали crypto-js на чистом JavaScript и опубликовали его как модуль crypto-es NPM. Этот модуль работает в React Native, NodeJS и браузере.
openssl может кодировать данные в двоичном формате или Base64. Я обнаружил, что проще всего загружать и расшифровывать файлы, закодированные в Base64, используя комбинацию компонента FileSystem и crypto-es. Кодировка Base64 часто форматируется строками по 76 символов с новой строкой в конце. openssl вместо этого можно создать одну длинную строку, это лучший формат. Командная строка для кодирования файла:
% openssl enc -aes-256-cbc -base64 -A < file.txt > encoded_file.txt
-base64 выбирает кодировку Base64 со строками, -A делает строки длинной строкой.
Я безуспешно пытался расшифровать файлы без использования -base64 и -A с использованием crypto-es. Я уверен, что это возможно, но использование этого формата сработало для меня лучше всего.
Мы можем использовать этот файл JavaScript с NodeJS:
import fs from 'fs'; import CryptoES from 'crypto-es'; if (process.argv.length == 3) { const pass = process.argv[2].split(':')[1]; const data = fs.readFileSync(0, 'utf-8'); function decodeBase64String(encrypted, pass) { var decrypted = CryptoES.AES.decrypt(encrypted, pass); var utf8 = CryptoES.enc.Utf8.stringify(decrypted); fs.writeFileSync(1, utf8); } decodeBase64String(data, pass); } else { console.log('need -pass:PASS'); }
Сохраните этот файл в decrypt.js.
Теперь давайте воспользуемся NodeJS для его расшифровки:
% node decrypt.js -pass:PASS < secretmsg.b64s The file contents are displayed.
Написание всего мобильного приложения требует гораздо больше усилий, но определение правильного набора параметров для openssl было самым сложным, настолько, что я долгое время избегал использования шифрования в JavaScript. Теперь, когда я понял это, я могу использовать шифрование столько, сколько захочу. Надеюсь, это поможет вам добавить шифрование в свой арсенал.
Первоначально опубликовано на https://focusedforsuccess.com 29 ноября 2020 г.