Javascript. Как эффективно хранить закрытый ключ Secp256k1 для схемы ECIES

Мне было очень трудно понять, как хранить закрытый ключ Secp256k1 из нескольких библиотек (в настоящее время это для шифрования ECIES: https://npm.io/package/@toruslabs/eccrypto).

Я пробовал кодирование и декодирование с помощью base64, многие реализации функций, которые копируют буфер массива для ввода закодированной строки в localStoarge и соответствующий вывод Uint8Array из localStorage, я пробовал с IndexedDB, JSON.stringify и parse не работают с двоичными данными, и поэтому еще много вариаций.

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

Я исчерпан, и я хотел бы получить некоторые профессиональные знания из-за моего отсутствия навыков в этом конкретном предмете. Итак, как я могу хранить (каким-либо образом, если он клиентский/локальный) закрытый ключ Secp256k1 таким образом, чтобы, если я вызову его из этой постоянной базы данных на стороне клиента, их можно было использовать для создания открытых ключей?


person Community    schedule 10.01.2021    source источник
comment
Вы генерируете закрытые ключи на стороне клиента или на стороне сервера?   -  person willi123yao    schedule 10.01.2021
comment
Я генерирую их на стороне клиента и надеюсь сохранить (любой метод подходит) на стороне клиента.   -  person    schedule 10.01.2021
comment
Пожалуйста, отредактируйте свой пост и отметьте операционную систему (имеется в виду платформа JavaScript), которую вы используете, так как возможное решение зависит от этого. Пожалуйста, добавьте минимальный пример кода (даже если он не работает) и, возможно, образец пары ключей Secp256k1 в кодировке PEM, спасибо. Поскольку большинство решений основаны на ключах PEM encoded = string, этот формат ключа можно легко сохранить в базе данных.   -  person Michael Fehr    schedule 10.01.2021


Ответы (1)


По-видимому, библиотека, использующая закрытый/открытый ключ (в данном случае @toruslabs/eccrypto) требует параметр буфера для ключей.

Простым решением было бы сделать NodeJS Buffer доступным в браузере через браузер. Вам нужно будет только включить класс NodeJS Buffer в объект окна при создании файла браузера, как показано ниже:

const eccrypto = require('./index');
window.eccrypto = eccrypto;
window.Buffer = Buffer;

Затем сгенерируйте файл пакета с помощью браузера: browserify main.js -o bundle.js

После этого вы сможете использовать класс Buffer в своем браузере, что сделает возможной загрузку закрытого/открытого ключа. Пример кода здесь:

<script src="bundle.js"></script>
<script>
  const eccrypto = window.eccrypto;

  const privateKey = eccrypto.generatePrivate();
  const publicKey = eccrypto.getPublic(privateKey);

  // hex string output of private key
  const hexPrivateKey = privateKey.toString('hex')
  console.log(hexPrivateKey); // we can do this as privateKey is a Buffer

  // load private key again
  const newPrivateKey = Buffer.from(hexPrivateKey, 'hex');
 
  const enc = new TextEncoder();

  // code referenced from @toruslabs/eccrypto README
  // Encrypting the message.
  eccrypto.encrypt(publicKey, enc.encode("my testing msg")).then(function (encrypted) {
    // Decrypting the message.
    eccrypto.decrypt(newPrivateKey, encrypted).then(function (plaintext) {
      console.log("Message:", plaintext.toString());
    });
  });
</script>

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

person willi123yao    schedule 10.01.2021
comment
Спасибо за ответ, я посмотрю, работает ли сохранение шестнадцатеричной версии закрытого ключа в localStorage. - person ; 10.01.2021
comment
Это все, чего мне не хватало? Вау, спасибо большое! Итак, когда я хочу сохранить закрытый ключ в строке, я должен сначала шестнадцатеричный, а затем из этого шестнадцатеричного возвращаются двоичные данные, верно? - person ; 10.01.2021
comment
Шестнадцатеричная строка — это, по сути, двоичный код ключей в шестнадцатеричном формате, вы можете хранить его в любом формате, но шестнадцатеричная строка — хороший пример для этого случая. - person willi123yao; 11.01.2021