Post
Topic
Board Идеи
Re: Авторизация на сайтах, при помощи биткоин
by
crypto_trader#43xzEXrP
on 09/08/2019, 21:31:27 UTC
Вот, даже на Вики в статье один из возможных способов применения - Click
То, что цифровые подписи можно использовать для аутентификации, это понятно, но разве что - интуитивно.
Конечно же, интересуют схемы или реализации, а лучше - код.
Пока, на данный момент, лучшее что я нашёл - это WAVES AUTH API,
которое работает при попытке подвязать WAVES-адрес на кране H2OX.io
А DSA и RSA видимо не подойдут?
Конечно подойдут. Только там, в википедии - одна строчка лишь.





Открытый ключ всегда передается отдельно, сертификатом где помимо ключа указано какой алгоритм (ECDSA, RSA, DSA или что-то другое) использовался.

Скорее всего, они уже включены в подпись, но я чё-то не вижу где.

Как можно заметить выше - нет. Да это и по логике видно, подпись == шифрование. Если ты зашифруешь что-то ключиком который только закрывает, то получить это что-то без ключика который открывает нельзя. А если ты этот ключик который открывает положил в сундучок, а потом закрыл ключом который закрывает, то все.
А теперь, смотри сюда...

Вот в этой строке, можно видеть, что в параметры функции проверки подписи,
помимо самой подписи и текста сообщения - входит address подписанта:
Code:
def verify_message(address, signature, message):
Но этот адрес нужен лишь для сравнения с другим адресом - addr:
Code:
   if address == addr:
        return True
При этом, вторая переменная addr, с которым сравнивается указанный address,
она получается из публичного ключа public_key:
Code:
addr = public_key_to_bc_address(encode_point(public_key, compressed))
А он, в свою очередь - вычисляется из некоей точки Q
Code:
public_key = ecdsa.VerifyingKey.from_public_point( Q, curve = SECP256k1 )
высчитываемой из параметров r (от которого зависит inv_r) и s:
Code:
Q = inv_r * ( s * R + minus_e * G )
Сами же эти параметры r, sorder) - они уже содержатся в самой цифровой подписи sig:
Code:
r,s = util.sigdecode_string(sig[1:], order)

Точка Q, очень похожа, на описанный тобой сертификат,
так как при получении публичного ключа public_key,
из неё - указывается не только алгоритм ecdsa,
но и сама эллиптическая кривая SECP256k1 (ну потому что их куча там, этих кривых).

Таким образом, public_key, а значит и addr (как ripemd160 sha256-хэша pub) -
они уже содержится в цифровой подписи sig, правда - косвенно, и передаются - вместе с ней.
Поэтому, public_key и addr, они могут быть извлечены - только лишь из неё, из подписи sig.
Сам же address подписанта сообщения (даже не pub) - он передаётся отдельно, в теле сообщения,
и нужен разве что - только для сравнения с ним, вычисленного из подписи sig - значения addr.
Но если не указать address, в теле сообщения,
то проверка всё-равно может пройти
(в том смысле, что public_key - всё-равно извлекается из подписи sig).

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