Безопасно ли хранить свои секреты на стороне клиента? - PullRequest
0 голосов
/ 08 июня 2019

Контекст безопасности моего вопроса выглядит следующим образом:

В настоящее время у меня есть электронное настольное приложение, которое запускает мое веб-приложение. Внутри моего приложения есть функция, которая позволяет аутентифицированному пользователю получить доступ к документу (pdf), который защищен паролем. Документ подготовлен на сервере, а пароль генерируется с использованием хэша SHA256 длиной 10 символов. Эти 10 символов состоят из двух частей: 1) переменный идентификатор документа и вторая фиксированная соль.

На клиенте внутри электрона в настоящее время у меня есть модуль нативного узла, который был написан на C и скомпилирован с использованием node-gyp. Я звоню в этот модуль, который содержит код для генерации одного и того же пароля, используя две части пароля. Вся цель наличия этого модуля нативного узла на клиенте состояла в том, что, поскольку модуль является скомпилированным двоичным файлом, он не может быть подвергнут обратному проектированию, и никто не может получить доступ к моей секретной соли. Если соль обнаружена, то другую часть легко найти, и, следовательно, все документы доступны злоумышленнику.

Я читал о WebAssembly и о том, как он компилирует код нижнего языка в wasm, который затем может быть загружен в браузеры. Это фактически означает, что я могу использовать тот же код C, который я использую в своем родном модуле, но теперь через Интернет, а не в электронном виде.

Мои сомнения были в части безопасности и обратного инжиниринга модуля wasm, который создается. Я читал, что можно выполнить обратный инжиниринг и получить файл C из wasm, но формат, который он дает, не совсем совпадает с исходным, и насколько он может помочь злоумышленнику, опять вопрос.

Некоторые темы, которые я прочитал

Помимо вопросов безопасности, я думаю, что, возможно, я использую wasm для неправильной цели, так как нахожусь в открытой сети, если есть код, источник которого не доступен для просмотра и аудита, он представляет очень большую проблему безопасности в целом.

Любые комментарии / советы будут полезны.

1 Ответ

3 голосов
/ 08 июня 2019

Сначала ответьте на ваш вопрос. Нет, WASM небезопасно хранить клиентские секреты для сценария, который вы описываете.

И ваша текущая реализация, похоже, также не безопасна (из-за ограниченной доступной информации).

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

Просто представьте себе случай, когда ваша соль хранится как переменная внутри программы c.

int main() {
 char* mySaltVar = "my salt";
 char* b = "my other string";
}

и вы компилируете это с помощью gcc и создадите двоичный файл. вы можете подумать, что эти строки не могут быть прочитаны как они внутри двоичного файла, но вы можете просто запустить программу strings в двоичном файле, чтобы получить строки внутри двоичного файла.

sk$ strings binary.out 
my salt
my other string

Две строки извлекаются из двоичного файла.

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

...