Могу ли я создать детерминированный кошелек и экспортировать/раскрывать отдельные ключи без ущерба для кошелька?

Сценарий:

  1. Создайте детерминированный кошелек и большее количество закрытых ключей и связанных биткойн-адресов на безопасном (например, автономном) компьютере.
  2. Надежно сделайте резервную копию семени. Надежно храните закрытые ключи (например, на листе бумаги).
  3. Запишите адреса и отправьте биткойны на несколько разных адресов. (Сейчас они находятся в холодильнике.)
  4. При необходимости возьмите один из закрытых ключей и импортируйте его из онлайн-кошелька (электронного кошелька, мобильного телефона и т. д.) (включая риск кражи закрытого ключа вредоносным ПО или оператором электронного кошелька. Однако такой кража будет относиться только к небольшой сумме, а не к вашему общему состоянию.)

Если один закрытый ключ детерминированного кошелька будет скомпрометирован (известно консультанту), останутся ли в безопасности другие ключи (и начальное число)?

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

Ян, в комментариях выше/ниже, возможно, неправильно понял, почему они делают что-то похожее на key = seed + hash(sequence). См. здесь для получения дополнительной информации: bitcointalk.org/index.php?topic=19137.0 Они в основном используют свойство ключей ECC. Вне хеш-функции находится не семя, а открытый ключ при генерации открытых ключей и закрытый ключ при генерации закрытых ключей. (примечание: у меня нет комментирующей кармы)

Ответы (5)

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

Он еще не реализован, но несколько авторов клиентов согласились принять его, как только он станет окончательным.

Ближе к концу вашей ссылки они выражают благодарность «Алану Райнеру за реализацию этой схемы в Оружейной [...]». Означает ли это, что текущие версии Armory уже используют эту схему (или что-то криптографически эквивалентное)?

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

https://github.com/pavlos-christoforou/биткойн

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

Прежде всего, давайте предположим, что кто-то закодировал (поскольку веб-сайт блокчейна выпустил некоторые инструменты в свой раздел API) программное обеспечение, способное создавать биткойн-адреса для внешних пользователей. В таком сценарии, если алгоритмы, содержащиеся в таком программном обеспечении, размещенном на сервере, могут создать кошелек с мультиподписью для пользователей, в том смысле, что определенному пользователю потребуются оба закрытых ключа (по 2 ключа на каждый адрес), созданные программное обеспечение для того, чтобы тратить монеты из такого одноадресного кошелька, и если, например, сервер хранит закрытый ключ A и доставляет пользователю закрытый ключ B, то мы получим ситуацию «гибридного онлайн-кошелька», где только пользователь может использовать оба ключа, A + B, чтобы создавать, подписывать и транслировать транзакции, связанные с его биткойн-адресом.

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

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

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

Один из них заключается в том, чтобы предоставить пользователю закрытый ключ A напрямую, что позволит ему использовать в другом месте (если и когда это необходимо) ключи A и B для подписи транзакций, или другой (как-то лучше), в котором алгоритм позволяет создавать третий ключ, ключ C, который можно использовать вместе с ключом B, чтобы тратить монеты с этого адреса. Другими словами, пользователь снова уходит с двумя закрытыми ключами в кармане, которых ему достаточно, чтобы использовать их для исчерпания соответствующего адреса (открытого ключа). Это можно реализовать либо с помощью начального числа (определенного закрытого ключа "D"), уникального для сервера (или учетной записи пользователя), либо путем установления в качестве начального значения даже ключа A. Если ключ A используется в качестве начального значения, тогда практически любой, у кого есть доступ к исходному коду программного обеспечения, может реплицировать весь диапазон адресов, созданных для конкретного пользователя (если ключ A «зависит от учетной записи пользователя», а не «от адреса»). Я считаю, что последнее невозможно использовать любому приличному системному администратору (если он хоть немного представляет себе риски, связанные с выбором безопасности такого низкого уровня). Итак, давайте предположим, что сервер создает семена с более высокими привилегиями (то есть специфичными для пользователя). Это, опять же, может иметь катастрофические последствия для любого неосторожного пользователя, который импортирует этот ключ A в любой кошелек с устройства, зараженного вредоносным ПО. (Может быть, это как-то напоминает кошелек Electrum? :/ ...) Я считаю, что последнее невозможно использовать любому приличному системному администратору (если он хоть немного представляет себе риски, связанные с выбором безопасности такого низкого уровня). Итак, давайте предположим, что сервер создает семена с более высокими привилегиями (то есть специфичными для пользователя). Это, опять же, может иметь катастрофические последствия для любого неосторожного пользователя, который импортирует этот ключ A в любой кошелек с устройства, зараженного вредоносным ПО. (Может быть, это как-то напоминает кошелек Electrum? :/ ...) Я считаю, что последнее невозможно использовать любому приличному системному администратору (если он хоть немного представляет себе риски, связанные с выбором безопасности такого низкого уровня). Итак, давайте предположим, что сервер создает семена с более высокими привилегиями (то есть специфичными для пользователя). Это, опять же, может иметь катастрофические последствия для любого неосторожного пользователя, который импортирует этот ключ A в любой кошелек с устройства, зараженного вредоносным ПО. (Может быть, это как-то напоминает кошелек Electrum? :/ ...)

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

Возвращаясь к вашей ситуации, у вас должен быть ключ B, предлагающий повышенные привилегии (позволяющий вам создавать ключи D и далее, но любой, кто использует D, не сможет создавать другие ключи). Поскольку, однако, такая вещь была бы бременем для кода, я бы предложил более простой вариант: один путь - один размер - транзакция. Это означает, что вы импортируете в любой кошелек по вашему выбору ключи после некоторой сладкой очистки основных функций. Как когда-то сказал Генри Форд о своих автомобилях «вы можете заказать любой цвет, а раз он только черный».

Импортированный адрес, где бы он ни хранился, может быть закодирован таким образом, чтобы сделать возможной одну единственную операцию : отправить платеж определенной суммы исключительно на другой адрес X из вас (например, вы можете каждый раз отправлять только около 0,1 BTC на ваш горячий кошелек). -- карманные деньги). Нужно что-то еще? Еще один фиксированный транш в размере 0,100 BTC на тот же адрес. Только то. Идеальный твик. Конечно, адрес X может храниться в аппаратном кошельке, полностью защищенном. Другие виды трат могут быть возможны только с использованием самого сервера (чтобы разблокировать полный контроль над балансом адресов).

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

И в целом компрометация закрытого ключа в кошельке не включает остальную часть кошелька.

Вот о чем я думал. Однако, прочитав исходный код электрума, я понял, что нужно быть осторожным: они используют что-то вроде KEY = SEED + HASH(sequence), что позволяет в некоторых обстоятельствах вычислить SEED.
Просто идея: тоже будет KEY=HASH(SEED + offset)работать? Таким образом, ни один, SEEDни другие адреса не будут угадываться.
@cdecker Я бы так подумал, но не верьте мне на слово. Лучше реализовать схему, проверенную экспертами по криптографии.
@cdecker Да, это было бы безопасно, потому что вы хэшируете семя вместе с другим параметром, тем самым изменяя весь результирующий хеш.
@Jan Если электрум используется таким образом, я бы не рекомендовал его для любого использования, поскольку семя скомпрометировано во всем закрытом ключе, что, на мой взгляд, ужасно.

Кошелек Armory позволяет это, и это никоим образом не ставит под угрозу безопасность кошелька. Однако это ставит под угрозу целостность ваших резервных копий. Детерминированные кошельки полезны тем, что вы можете сделать одну резервную копию прямо в начале (до ее использования), и она будет хорошей резервной копией навсегда.

То есть, если вы не импортируете адреса откуда-то еще. Этих новых адресов не будет в вашей старой резервной копии, поэтому вам придется сделать новую резервную копию в этот момент.