Многие приложения Electron взаимодействуют с удаленным веб-сервисом или API, что, вероятно, означает, что приложение должно хранить для этого учетные данные (могут быть токены доступа API, пароль и т. Д.). Как это сделать безопасно? Простое сохранение его в виде обычного текста в незащищенном файле может стать проблемой для безопасности.
TL; DR Код для этого примера находится здесь, в папке storing-sensitive-data
.
Mac, Windows и Linux предлагают безопасные решения для этого с помощью ключа шифрования, полученного на основе имени пользователя. В Mac OS есть Связка ключей, в Windows - Диспетчер учетных данных, а в Linux - Связка ключей Gnome. API-интерфейсы для них доступны на C ++ для каждого из них, поэтому нам нужен надстройка собственных узлов, обеспечивающая привязку этих API-интерфейсов к Javascript. Вот тут-то и пригодится node-keytar.
Node-keytar имеет простой API. Он предоставляет вам такие методы, как getPassword
, addPassword
и replacePassword
, которые позволяют получать, добавлять, изменять и удалять записи из хранилища паролей ОС. Обратите внимание, что мы используем слово «пароль» здесь нечетко - «пароль» - это просто строка, и это может быть токен доступа API.
Добавим пароль для тестирования. Сначала мы сделаем это на простом node.js. Просто npm install keytar
создайте index.js
файл и добавьте следующее:
/** * The API for this is: * addPassword(service, account, password) */ keytar.addPassword('KeytarTest', 'AccountName', 'secret');
В реальном приложении Electron параметром service
будет имя вашего приложения. account
, как и ожидалось, это имя учетной записи. Например, если вы храните токен доступа к стороннему API, например StackExchange, я бы назвал его именно так.
Запустите это, и вы должны увидеть что-то вроде ниже в приложении Связки ключей Mac OS.
Если мы снова запустим addPassword
для службы и учетной записи, которые уже есть в магазине, метод вернет false, и он не будет обновлен. Следовательно, потребность в replacePassword
. Однако запуск replacePassword
в несуществующей службе и учетной записи приведет к созданию новой, так что это похоже на апсерт.
В Связке ключей, если вы щелкните правой кнопкой мыши строку KeytarTest ›Получить информацию, а затем щелкните Контроль доступа, вы увидите:
Это важно. Поскольку node.js добавил пароль, любой процесс node.js позже сможет получить к нему доступ без запроса пользователя. (Когда вы упаковываете свое приложение Electron, этим значением будет имя вашего приложения, и только ваше приложение будет иметь доступ без запроса). Это хорошо, потому что это не лучший опыт, когда приложение постоянно предлагает пользователю доступ к Связке ключей. Помните, что пользователь может изменить эти значения в любое время, поэтому убедитесь, что ваш код обрабатывает сценарии, когда пользователь неожиданно удаляет данные вашего пароля из своего хранилища.
Давайте найдем только что сохраненный пароль.
const secret = keytar.getPassword('KeytarTest', 'AccountName'); console.log(secret); // "supersecret"
Получаем строку, которую сохранили. Ура! На моем MacBook Pro середины 2015 года выполнение этого метода занимает около 40 мс, вероятно, из-за времени, необходимого для расшифровки. Так что это не самый быстрый способ. Это может иметь или не иметь последствий для дизайна вашего приложения, если вы получаете его много.
Если вы попытаетесь getPassword
ввести пароль, созданный другим приложением, появится диалоговое окно, подтверждающее, что это нормально. Таким образом, никакое другое приложение не может получить доступ к вашим сохраненным паролям, если пользователь явно не предоставит разрешение.
Теперь вы можете использовать node-keytar свое приложение Electron, используя те же методы, которые описаны выше. При установке node-keytar для использования в приложении Electron его необходимо скомпилировать с версией Electron v8. Вы можете следовать этому руководству о том, как это сделать.
Еще одно важное замечание: я рекомендую вам вызывать node-keytar
только из основного процесса. Если вы установите пароль от основного процесса, а затем попытаетесь получить его от процесса рендеринга, он предложит пользователю диалоговое окно разрешений (это только macOS, Windows, похоже, в любом случае не возражает). Кроме того, я думаю, что для пользователя будет чище и понятнее, если в списке управления доступом будет указано имя вашего приложения и его значок, а не MyApp Helper
и общий значок приложения, который вы получаете, когда его устанавливает средство визуализации.
Вот и все! Node-keytar предлагает простой способ лучше защитить ваше приложение.
P.S. Я рекомендую посмотреть это двухминутное соло на клавишных от Kool & the Gang. Это сделает вас лучшим программистом.
Полный видеокурс о том, как создать приложение Electron…
От создания вашего первого BrowserWindow до развертывания вашего приложения - ознакомьтесь с моим курсом на Egghead.io!