Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как зашифровать данные PIN-кодом? (https://javascript.ru/forum/misc/85157-kak-zashifrovat-dannye-pin-kodom.html)

webgraph 26.04.2023 13:59

Как зашифровать данные PIN-кодом?
 
Стандартные инструменты Web Crypto API позволяют сгенерировать пару закрытый-открытый ключ для шифрования и дешифрования данных.

А как сделать так, чтоб сначала пользователь придумал PIN-код, а потом система зашифровала какие-либо данные этим пин-кодом? А потом этим же пин-кодом расшифровала его?

Предполагается, что пин-код состоит из 4 или 6 цифр.

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Encrypt PIN</title>
</head>
<body>
<style>
    h1 {
        margin: 0;
        font-size: 22px;
    }
    p {
        margin: 16px 0 12px;
    }
    .columns {
        display: grid;
        grid-template-columns: repeat(2, 1fr);
    }
</style>

<h1>Шифрование данных PIN-кодом</h1>

<section class="columns">
<div>
    <p>Придумать пин-код и зашифровать данные</p>
    <form id="encryp">
        <input id="encrypt-pin" type="password" placeholder="Придумайте пин-код">
        <input id="encrypt-data" placeholder="Данные для шифрования">
        <input id="encrypt-button" type="submit" value="Encrypt">
    </form>
    <div id="encrypt-export"></div> <!-- Здесь выводится зашифрованная информация -->
</div>

<div>
    <p>Ввести пин-код и расшифровать данные</p>
    <form id="decrypt">
        <input id="decrypt-pin" type="password" placeholder="Пин-код шифрования">
        <input id="decrypt-data" placeholder="Данные для расшифрования">
        <input id="decrypt-button" type="submit" value="Decrypt">
    </form>
    <div id="decrypt-export"></div>  <!-- Здесь выводится расшифрованная информация -->
</div>
</section>

</body>
</html>

voraa 26.04.2023 15:57

https://developer.mozilla.org/en-US/...ypto/deriveKey
Там последний пример - как из некоего пароля получить ключ, а потом этим ключом шифровать данные.

webgraph 26.04.2023 16:25

Цитата:

Сообщение от voraa (Сообщение 551657)
https://developer.mozilla.org/en-US/...ypto/deriveKey
Там последний пример - как из некоего пароля получить ключ, а потом этим ключом шифровать данные.

Да, тоже уже нашли данную инфу. И в таком случае, если закрытый ключ хранится где-то в localStorage или IndexedDB — и любой посторонний может получить доступ к нему и обойти ввод пароля.

А как сделать так, чтобы пароль этот хранился локально в каком-либо виде, но и в то же время был недоступным для пользователей, которые обладают навыками программирования и потенциально могут просто получить его?

MallSerg 26.04.2023 17:07

Цитата:

А как сделать так, чтоб сначала пользователь придумал PIN-код,
Нужно использовать этот пин код в качестве генератора ключа шифрования.
В крипто апи для этого используется метод deriveKey() желательно по алгоритму PBKDF2
Цитата:

а потом система зашифровала какие-либо данные этим пин-кодом? А потом этим же пин-кодом расшифровала его?
Для этого предназначен специальный алгоритм шифрования/расшифровки использующие одинаковый ключ для шифрования и расшифровки.
В крипто апи это методы encrypt() и decrypt() по алгоритму AES-GCM с этим алгоритмом желательно хранить/передавать уникальный вектор инициализации для каждого зашифрованного сообщения этот вектор не является секретным и может открыто передаваться однако его наличие сильно повышает криптостойкость.

webgraph 26.04.2023 17:13

Цитата:

Сообщение от MallSerg (Сообщение 551660)
Нужно использовать этот пин код в качестве генератора ключа шифрования.
В крипто апи для этого используется метод deriveKey() желательно по алгоритму PBKDF2

Для этого предназначен специальный алгоритм шифрования/расшифровки использующие одинаковый ключ для шифрования и расшифровки.
В крипто апи это методы encrypt() и decrypt() по алгоритму AES-GCM с этим алгоритмом желательно хранить/передавать уникальный вектор инициализации для каждого зашифрованного сообщения этот вектор не является секретным и может открыто передаваться однако его наличие сильно повышает криптостойкость.

Допустим, мне надо локально хранить какое-то суперсекретное сообщение. И постоянно к нему обращаться. Получается, что я создаю пароль, с помощью этого пароля шифрую этот суперсекретное сообщение и сохраняю в localStorage. Когда мне требуется расшифровать — я просто генерирую новую пару закрытого-открытого ключа на основе пин-кода и полученной парой ключей расшифровываю свое суперсекретное сообщение?

Так вы имеете ввиду?)

MallSerg 26.04.2023 17:13

Цитата:

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

webgraph 26.04.2023 17:22

Цитата:

Сообщение от MallSerg (Сообщение 551662)
Если у злоумышленника есть физический доступ к машине то криптография теряет смысл.
В таких случаях пытаются реализовать другие меры например двух факторную авторизацию. Тогда злоумышленнику понадобиться доступ и к личному телефону или персональному ключу.

Двухфакторная аутентификация актуальна для клиент-серверных операций. А здесь актуальны операции только на клиенте. Неужели нет способа защитить локальные данные?

webgraph 26.04.2023 18:52

Цитата:

Сообщение от voraa (Сообщение 551657)
https://developer.mozilla.org/en-US/...ypto/deriveKey
Там последний пример - как из некоего пароля получить ключ, а потом этим ключом шифровать данные.

Ааа. Получается можно сохранить в localStorage:

1. salt
2. iv - почти тоже самое что и salt
3. зашифрованный текст

И когда требуется расшифровка — вводим пароль и всё — данные расшифровываются. Сам пароль получается вообще никак не надо ни хэшировать, ни хранить где-либо.

webgraph 26.04.2023 19:20

Цитата:

Сообщение от MallSerg
Если у злоумышленника есть физический доступ к машине то криптография теряет смысл.

С чего вы так решили?) Объясните более подробно вашу позицию и предоставьте факты)

MallSerg 26.04.2023 22:17

Цитата:

С чего вы так решили?) Объясните более подробно вашу позицию и предоставьте факты)
Физический доступ к компьютеру позволяет проводить криптоатаку "человек посередине". Обычно это всякие кейлогеры и расширения браузера.
Что бы этого избежать в систему криптообмена вводят третий фактор не зависящий от скомпрометированной части системы. Например шифрование и расшифровку производит отдельное устройство вставленное в USB порт или сервис в интернете присылает SMS необходимое для расшифровки.
В целом не так важно как третий фактор будет работать с системой главное не полагаться на скомпрометированную часть системы полностью.

webgraph 26.04.2023 23:48

Цитата:

Сообщение от MallSerg (Сообщение 551667)
Физический доступ к компьютеру позволяет проводить криптоатаку "человек посередине". Обычно это всякие кейлогеры и расширения браузера.
Что бы этого избежать в систему криптообмена вводят третий фактор не зависящий от скомпрометированной части системы. Например шифрование и расшифровку производит отдельное устройство вставленное в USB порт или сервис в интернете присылает SMS необходимое для расшифровки.
В целом не так важно как третий фактор будет работать с системой главное не полагаться на скомпрометированную часть системы полностью.

Извините, а вы читать умеете?) Речь идет о локальном шифровании, т.е. оффлайн. О каких SMS речь?)

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

MallSerg 27.04.2023 12:24

Цитата:

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

Цитата:

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

Цитата:

И чем же принципиально отличается USB-флешка от пароля
Глупо сравнивать такие понятия т.к. такое сравнение теряет здравый смысл. непонятна сама причина такого странного вопроса.

webgraph 27.04.2023 13:04

Цитата:

Сообщение от MallSerg
на телефоне умеет генерировать код для двухфакторной авторизации

Давайте теперь использовать 100500 тысяч устройств, чтобы использовать систему. Сейчас многие пользуются только телефоном, т.е. 1 устройством, поэтому ваша геймерская логика должна отдохнуть.


Цитата:

Сообщение от MallSerg
Это мягко говоря очевидная глупость =).В таком случае алгоритм расшифровки не смог бы получить этот пароль и как следствие работать.

Какая ещё глупость? Всё прекрасно работает — вводишь данные, потом алгоритм запрашивает пароль, которым и шифрует эти данные. После чего сохраняет зашифрованный текст, соль и вектор, т.е. сам пароль не сохраняется ни в каком виде.


Цитата:

Сообщение от MallSerg
Эта и служит источником проблемы заставляя раскрыть секрет пароля уязвимой части системы шифрования.

Иногда вы так пишете, словно пердёжь в лужу. Без логики, без фактов, без доказательств, без какого-то внятного объяснения.


Цитата:

Сообщение от MallSerg
Глупо сравнивать такие понятия

Смотрю в ваших словах слишком часто встречается слово глупость — видимо вы пытаетесь донести то, ваши высказывания глубоко пропитаны глупостью и отсутствием здравого смысла.

Идите лучше учите уроки, у вас ОГЭ скоро. Нечего тут сидеть и нести херню.

Либо выражайтесь конкретно — фактами и доказательствами, без вставки ваших 5 копеек.

webgraph 27.04.2023 13:21

voraa,
Может ты как-то прокомментируешь высказывания от MallSerg?))

MallSerg 27.04.2023 15:39

Цитата:

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

webgraph 27.04.2023 15:53

Цитата:

Сообщение от MallSerg (Сообщение 551675)
Должно быть очевидно что в этот момент и происходит сохранение пароля в локальной области памяти и передача сохраненной информации в алгоритм шифрующий данные.
Это явно противоречит заявлению - "нигде не хранится".

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

Поэтому совершенно непонятно, что вам там "очевидно" — очередные пустые слова без подтверждений.

MallSerg 27.04.2023 16:41

Цитата:

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

вывод
Утверждение - "злоумышленник не сможете получить данные пароля" является ложью.

очевидно или еще нет?

webgraph 27.04.2023 17:19

Цитата:

Сообщение от MallSerg (Сообщение 551677)
факты
1. существует таком момент когда пароль хранится (между вводом пароля и вызовом getKeyMaterial).
2. в этот моменть злоумышленник может его сохранить (имеет полный доступ к компьютеру).

вывод
Утверждение - "злоумышленник не сможете получить данные пароля" является ложью.

очевидно или еще нет?

В таком случае вообще при любом способе защиты у злоумышленника есть доступ к данным.

В моём же случае имелось ввиду, что у злоумышленника может быть локальный доступ к системе в том случае, когда рядом нет владельца. Т.е., например, владелец каким-то образом оставил приложение открытым и злоумышленник начал там копаться, чтобы получить доступ к секретным данным. Он может попытаться взломать с помощью перебора паролей.

И в нашем случае речь идет о мобильном приложении PWA.

MallSerg 27.04.2023 18:52

Цитата:

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

повторюсь
Цитата:

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

Далеко не факт что это хорошее решение в рамках твоего приложения но не стоит считать такую систему шифрования надежной.

webgraph 27.04.2023 19:02

MallSerg,
А как хранит секретные данные (SEED-фразу) MetaMask?

MallSerg 27.04.2023 20:09

Цитата:

А как хранит секретные данные (SEED-фразу) MetaMask?
Без понятия. MetaMask и им подобные программы/сервисы работают на доверии пользователей.
поэтому сид-фразу MetaMask можно прочитать в обычном текстовом файле.
подробнее https://nvd.nist.gov/vuln/detail/CVE-2022-32969

Что бы решать подобные вопросы серьезные организации разрабатывают Стандарты информационной безопасности. В таких стандартах описываются условия и требования к обмену информацией и на основании проверки соблюдения стандартов организации выдают сертификаты и лицензии на право какой либо деятельности.

webgraph 27.04.2023 20:48

Цитата:

Сообщение от MallSerg
сид-фразу MetaMask можно прочитать в обычном текстовом файле

Это не так. ChatGPT ответил:

Цитата:

Сообщение от ChatGPT
"Сначала MetaMask просит придумать пароль — именно этим паролем он и шифрует SEED-фразу с помощью PBKDF2"

— в принципе, это тоже самое о чём мы здесь и говорили ранее.

Дальше он пишет, мол
Цитата:

Сообщение от ChatGPT
"MM сохраняет хэш этого пинкода в локальном хранилище и в дальнейшем сравнивает его с хэшем вводимого пароля. И если хэши совпадают, то доступ к кошельку открывается."

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

Или я чего-то не догоняю?

Представим условно, что a = hashPassword и b = sha256(promptPassword). Получается внутри системы должна быть функция, которая сравнивает a и b , и если всё ок, то открывает доступ к системе, а так же сохраняет этот пинкод в открытом виде (чтоб с помощью PBKDF2 расшифровывать seed-фразу)?

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

Так всё и работает исходя из ответа ChatGPT?

MallSerg 27.04.2023 23:46

Цитата:

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

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

webgraph 27.04.2023 23:57

Цитата:

Сообщение от MallSerg (Сообщение 551684)
Хеш функции для паролей обладают свойством необратимости результата хеширования т.е. зная хеш от пароля никакими средствами нельзя узнать пароль. Когда пользователь авторизуется с помощью пароля алгоритм авторизации снова считает хеш и сравнивает его с сохраненным в базе данных если хеши совпадают пароль считается верным.

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

Вы научитесь внимательно читать? То что вы описали касается серверных операций. Т.е. пароль отправляется на сервер, хешируется и сравнивается с хешем который в базе. Если они сходятся, то выполняется функция.

Но когда у нас локально это всё работает — мне ничего не мешает просто взять функцию и запустить её через консоль. То есть локально я могу легко обойти этап сравнивания хешей.

Поэтому какой в этом смысл тогда?

MallSerg 28.04.2023 00:26

Цитата:

ничего не мешает просто взять функцию и запустить её через консоль
Мешает тот факт что пароль является частью ключа.
т.е. проверка хеша лишь удостоверит что пароль(часть ключа) является верным и данные будут расшифрованы.

webgraph 28.04.2023 00:44

Цитата:

Сообщение от MallSerg (Сообщение 551686)
Мешает тот факт что пароль является частью ключа.
т.е. проверка хеша лишь удостоверит что пароль(часть ключа) является верным и данные будут расшифрованы.

А зачем тогда вообще эта проверка нужна? Можно было бы понять, если бы это были серверные операции — чтобы каждый раз не отправлять пин-код на сервер и проверять его там — т.е. не создавать нагрузку на инфраструктуру (или для защиты от DDOS-атаки).

Но у нас же это локально происходит. Получается хранить хеш пароля, чтоб потом его сравнивать на стороне клиента — в этом просто смысла нет? Или есть?

MallSerg 28.04.2023 01:18

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

webgraph 28.04.2023 02:17

Цитата:

Сообщение от MallSerg (Сообщение 551688)
Смысл в том что алгоритм будет знать что он работает правильно т.е. расшифрует сообщение а не покажет ошибку о неверно введенном пароле.
Использование сохраненного хэша сохраняет в тайне часть ключа (пароль).
В такую систему можно добавить и другие части ключа и точно также с помощью хэша их проверять. Даже если злоумышленник будет знать алгоритм работы и хэши это не позволит ему получить доступ к системе без знания всех секретов системы (пароли пинкоды смс биометрические данные и тому подобного).

А как тогда хранить пароль, если надо чтобы система его запомнила (и удалила, например, после 5 минут отсутствия активности)?

MallSerg 28.04.2023 02:56

Хранение пароля делает систему уязвимой по этому этого стараются избежать при создании алгоритмов работы защищенных систем.
Думаю самой распространенной практикой является создание сессии или токена актуальных в какой то заранее указанный промежуток времени.
Где опять же используется свойство необратимости хеш функций способных подтверждать истинность события(цифровая подпись) не раскрывая при этом секрета.

webgraph 28.04.2023 12:51

Цитата:

Сообщение от MallSerg (Сообщение 551690)
Хранение пароля делает систему уязвимой по этому этого стараются избежать при создании алгоритмов работы защищенных систем.
Думаю самой распространенной практикой является создание сессии или токена актуальных в какой то заранее указанный промежуток времени.
Где опять же используется свойство необратимости хеш функций способных подтверждать истинность события(цифровая подпись) не раскрывая при этом секрета.

Каким образом может помочь токен, если мы используем шифрование пин-кодом? Получается, что система должна как-то хранить этот пин-код, чтобы производить операции дешифровки в течение ограниченного времени.


Часовой пояс GMT +3, время: 00:04.