Использование обратного вызова парольной фразы в ruby gpgme
Я использую гем ruby gpgme (1.0.8). Мой обратный вызов парольной фразы не называется:
def passfunc(*args)
fd = args.last
io = IO.for_fd(fd, 'w')
io.puts "mypassphrase"
io.flush
end
opts = {
:passphrase_callback => method(:passfunc)
}
GPGME.decrypt(input,output, opts)
У кого-нибудь есть рабочий пример обратного вызова парольной фразы?
3 ответа
Пример обратного вызова вы можете найти в следующем рабочем примере. Он подписывает файл в отдельном режиме, т. Е. Файл подписи отделяется от исходного файла. Он использует набор ключей по умолчанию в ~/.gnupg или что-то в этом роде. Чтобы использовать другой каталог для вашего набора ключей, установите переменную окружения ENV["GNUPGHOME"]="" перед вызовом GPGME::sign().
#!/usr/bin/ruby
require 'rubygems'
require 'gpgme'
puts "Signing #{ARGV[0]}"
input = File.open(ARGV[0],'r')
PASSWD = "abc"
def passfunc(hook, uid_hint, passphrase_info, prev_was_bad, fd)
puts("Passphrase for #{uid_hint}: ")
io = IO.for_fd(fd, 'w')
io.write(PASSWD+"\n")
io.flush
end
output = File.open(ARGV[0]+'.asc','w')
sign = GPGME::sign(input, {
:passphrase_callback => method(:passfunc),
:mode => GPGME::SIG_MODE_DETACH
})
output.write(sign)
output.close
input.close
Вот еще один рабочий пример для вас, который не использует отдельную подпись. Чтобы проверить это, просто замените user@host.name на идентификатор вашего ключа и сделайте следующее: GPG.decrypt(GPG.encrypt('some text',:armor => true))
require 'gpgme'
require 'highline/import'
module GPG
ENCRYPT_KEY = 'user@host.com'
@gpg = GPGME::Crypto.new
class << self
def decrypt(encrypted_data, options = {})
options = { :passphrase_callback => self.method(:passfunc) }.merge(options)
@gpg.decrypt(encrypted_data, options).read
end
def encrypt(data_to_encrypt, options = {})
options = { :passphrase_callback => self.method(:passfunc), :armor => true }.merge(options)
@gpg.encrypt(data_to_encrypt, options).read
end
private
def get_passphrase
ask("Enter passphrase for #{ENCRYPT_KEY}: ") { |q| q.echo = '*' }
end
def passfunc(hook, uid_hint, passphrase_info, prev_was_bad, fd)
begin
system('stty -echo')
io = IO.for_fd(fd, 'w')
io.puts(get_passphrase)
io.flush
ensure
(0 ... $_.length).each do |i| $_[i] = ?0 end if $_
system('stty echo')
end
$stderr.puts
end
end
end
Ура!,
- Карл
Важно отметить, что начиная с GnuPG 2.0 (и в 1.4, когда use-agent
опция используется) pinentry
используется для сбора парольной фразы. Это означает, что обратный вызов gpgme passphrase не будет вызываться. Это описано здесь, и пример использования можно найти в gpgme-tool
пример.