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 необходимое для расшифровки.
В целом не так важно как третий фактор будет работать с системой главное не полагаться на скомпрометированную часть системы полностью.


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