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

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

Есть ли способ разрешить биткойну запрашивать парольную фразу кошелька?

Смотрите этот связанный пост: security.stackexchange.com/questions/146019/…

Ответы (6)

Все, что вы можете сделать из командной строки, вы также можете сделать из JSON API, что означает, что та же самая команда разблокировки может быть отправлена ​​​​из кода так же легко. Насколько мне известно, нет готовой утилиты, способной на это, но API достаточно прост, и я не могу себе представить, чтобы на самом деле создать такой инструмент было ужасно сложно.


Изменить: это было намного проще, чем ожидалось, сделать это в Python. Предполагая, что у вас установлен модуль Python JSON-RPC , просто используйте этот код:

from jsonrpc import ServiceProxy
from getpass import getpass
access = ServiceProxy("http://127.0.0.1:8332")
pwd = getpass("Enter wallet passphrase: ")
access.walletpassphrase(pwd, 60)

Точно так же вы можете вызвать access.walletlock()блокировку кошелька по запросу и walletpassphrasechange(old, new)изменить парольную фразу, даже не видя командной строки.


Редактировать 2: я также отправил вопрос разработчикам на github от вашего имени.

Редактировать 3: был принят запрос на вытягивание, содержащий мои скрипты Python. Загрузка исходников биткойнов с github теперь включает скрипты для этой цели в contrib/wallettools.

Редактировать 4: был отправлен новый отчет об ошибке, чтобы запросить правильное поведение встроенной команды.

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

$ read x
password goes here
$ bitcoind walletpassphrase "$x" 60
$ x=
$ 

Команда read xсчитывает следующую строку текста, которую вы набираете, и помещает ее в переменную оболочки x.

Команда x=перезаписывает переменную оболочки; в противном случае $x будет хранить ваш пароль до тех пор, пока вы не выйдете из текущей оболочки.

В истории это отображается так:

2032  read x
2033  bitcoind walletpassphrase "$x" 60
2034  x=
2035  history

Я ожидаю, что пароль появится в /proc/ во время выполнения bitcoindкоманды, но это должно быть только на долю секунды.

Хотя это скрывает парольную фразу из истории оболочки, она все равно будет отображаться в других местах ( ps -axили ps -ef, например, покажет bitcoindкоманду как вызванную, включая значение )$x
@ voretaq7 нет, он не отображается в ps, см. этот обновленный вопрос.
У меня он отображается в выводе ps, но только до тех пор, пока выполняется команда bitcoind, а это почти совсем не время. Попробуйте "sleep $x", где x равно 999, затем 'ps -ef | grep sleep» в другом окне, чтобы увидеть его.

Официальный ответ разработчика — использовать предоставленную оболочку python в contrib/bitrpc/bitrpc.py( github ):

Например, он запрашивает пароль безопасным способом, если вы используете команду walletpassphrase. Не планируется добавлять интерактивные функции в файлы bitcoin-cli.

а также:

bitcoin-cliостанется как есть и не получит интерактивной функциональности.

Источник: #2318

Разблокировать кошелек:

$ python bitrpc.py walletpassphrase

Изменить парольную фразу:

$ python bitrpc.py walletpassphrasechange

https://github.com/bitcoin/bitcoin/tree/master/contrib/bitrpc

этот файл больше не существует.

В командной строке нажмите ALT+ F7, чтобы удалить все команды, хранящиеся в памяти для текущего буфера истории.

На данный момент это решает проблему, но на самом деле неприемлемо, чтобы парольная фраза появлялась в буфере. Кроме того, хранится ли буфер исключительно в памяти или в какой-то момент он записывается на диск? Если да, Alt+F7 надежно уничтожает содержимое таких файлов или просто удаляет их?
Буфер хранится исключительно в памяти, и если пользователь не забудет очистить историю, я не понимаю, как это менее безопасно, чем дополнительный запрос пароля. Потому что, если вредоносная программа имеет доступ к буферу памяти cmd, это также означает, что она может перехватить ввод пароля прямо с клавиатуры.
Я не думаю, что нас беспокоят вредоносные программы, захватывающие память, а многопользовательские ПК и забывание очистить буфер.
В какой операционной системе работает это сочетание клавиш?
@akaihola, командная строка Windows

Теперь вы должны использовать bitcoin-cli -stdinwalletpassphrase walletpassphrase 10, где 10 — это количество секунд, в течение которых вы хотите оставить свой кошелек разблокированным. -stdinwalletpassphraseбыл добавлен в этот PR: https://github.com/bitcoin/bitcoin/pull/13716

Если вы поставите перед командой пробел, например «echo hello world», она не будет сохранена в истории. Это может быть только функция bash и idk, если ее можно отключить. Проверь это. Риск здесь заключается в том, что в конце концов вы можете забыть о пробеле.

способ запретить bash сохранять историю — установить $HISTFILE в /dev/null
@Mercedes Вы имеете в виду вообще не хранить историю или только для одной команды? Что не так с префиксом ''?