Хранение зашифрованного закрытого ключа на сервере

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

Я хочу научиться делать веб-сайт, в базе данных которого не хранятся чьи-либо личные данные.

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

Используя brainwallet , процесс создания учетной записи выглядит следующим образом:

  1. Клиент создает закрытый ключ.
  2. Пользователь вводит логин/пароль
  3. Клиент шифрует закрытый ключ паролем. Клиент хеширует пароль и имя пользователя. Клиент отправляет данные на сервер.
  4. Сервер хранит хешированное имя пользователя/пароль и зашифрованный закрытый ключ в базе данных.

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

  1. Пользователь вводит имя пользователя и пароль.
  2. Клиент отправляет на сервер хешированное имя пользователя/пароль.
  3. Сервер отвечает зашифрованным закрытым ключом для этого пользователя.
  4. Клиент расшифровывает закрытый ключ с помощью пароля.

В качестве примечания: это надежный процесс хранения и передачи данных на сервер?

Ответы (1)

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

Это действительно не то место, где можно учиться. Даже самые защищенные биткойн-сервисы регулярно подвергаются атакам.

Используя brainwallet, процесс создания учетной записи выглядит следующим образом:

«Мозговые кошельки» — невероятно простой способ для пользователей потерять все свои средства. Это происходит каждый день. Думаете, ваше предложение из 8 слов достаточно сильное? Скорее всего, это не так, и есть как минимум три бота, которые опустошат кошелек за считанные секунды после получения средств.

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

Код, на который вы ссылаетесь, — это всего лишь интерфейс для blockchain.info и библиотеки bitcoinjs.

В качестве примечания: это надежный процесс хранения и передачи данных на сервер?

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

Код мозгового кошелька, который я связал, не является настоящим мозговым кошельком, это реализация javascript для генерации адресов и создания/подписания транзакций. Я думаю, что безопасность, полученная от хранения зашифрованного закрытого ключа, а не открытого текста закрытого ключа, значительна. В конце концов, если пользователь собирается использовать веб-кошелек, он предпочтет blockchain.info любому конкуренту, у которого есть доступ к их закрытому ключу в виде открытого текста.
Blockchain.info в любом случае имеет доступ к закрытым ключам, нужно быть дураком, чтобы поверить в обратное. Если не они, то кто-то с рутом на своих боксах, или кто-то из cloudflare, или дворник в центре обработки данных. Криптовалюта на основе JavaScript не может и никогда не будет безопасной, когда код, защищающий данные, загружается с возможно враждебного сервера. Даже если бы не было бэкдора (я не говорю, что он есть), любое шифрование JS слабое и медленное, усугубляемое тем, что пользователи выбирают неверные пароли. Лучше просто отказаться от завесы ложной безопасности и хранить ключи на стороне сервера.