Sto cercando di implementare una funzione "Verifica con Bitcoin-OTC " per la mia app web. L'idea generale è che l'utente dimostrerebbe di possedere un account particolare sul sito esterno Bitcoin-OTC e la mia app lo accetterebbe / negherebbe in base alla sua valutazione.
Ecco come sto pensando di implementarlo:
- L'utente fornisce il nome utente Bitcoin-OTC.
- La mia app cerca la sua impronta digitale GPG usando questo gioiello bitcoin-otc .
- La mia app presenta all'utente la sua password monouso crittografata e gli chiede di decrittografarla.
- L'utente fornisce la password decodificata.
- La mia app lo verifica con il comando gpg everify su Freenode e accetta / nega l'utente.
La parte con cui sto combattendo è il punto # 5. Lo sto facendo in questo modo perché non sono sicuro che Bitcoin-OTC esponga un'API. Non sono sicuro di come comunicare in modo programmatico con il bot sul loro canale IRC.
I passaggi 1-5 sono fondamentalmente come un utente dovrebbe verificare se stesso sul canale IRC Bitcoin-OTC, tranne che la mia app agisce da intermediario.
Le mie domande sono:
- Come posso ottenere il passaggio n. 5?
- L'aggiunta della mia app a questo flusso introduce rischi per la sicurezza?
Modifica
Ho fatto delle ricerche e ho capito che probabilmente posso solo far firmare all'utente un messaggio in cui afferma di possedere l'account Bitcoin-OTC in questione.
Se il messaggio è firmato con l'impronta digitale legata all'account Bitcoin-OTC e la firma è affidabile, allora posso essere sicuro che l'utente è chi dice di essere?
Ecco il mio flusso proposto in uno script Ruby ad-hoc:
require 'bitcoin/otc'
account = Bitcoin::OTC::Account['mhluska']
message = Time.now.to_i.to_s + " I am the owner of username #{account.nick} on Bitcoin-OTC"
puts 'Run the following command to sign a message using your GPG fingerprint #{account.fingerprint}:'
puts "$ echo \"#{message}\" | gpg --clearsign"
puts "Paste it back here and press Ctrl+D"
$/ = "require 'bitcoin/otc'
account = Bitcoin::OTC::Account['mhluska']
message = Time.now.to_i.to_s + " I am the owner of username #{account.nick} on Bitcoin-OTC"
puts 'Run the following command to sign a message using your GPG fingerprint #{account.fingerprint}:'
puts "$ echo \"#{message}\" | gpg --clearsign"
puts "Paste it back here and press Ctrl+D"
$/ = "%pre%"
message = STDIN.gets
response = %x[echo "#{message}" | gpg --verify 2>&1]
if response.include?('Good signature')
if response.include?('This key is not certified')
puts 'Good signature but untrusted'
else
puts 'Good signature and trusted'
end
else
puts 'Bad signature'
end
"
message = STDIN.gets
response = %x[echo "#{message}" | gpg --verify 2>&1]
if response.include?('Good signature')
if response.include?('This key is not certified')
puts 'Good signature but untrusted'
else
puts 'Good signature and trusted'
end
else
puts 'Bad signature'
end