2009-12-08 5 views
3

J'utilise ruby ​​gpgme gem (1.0.8). Mon rappel de phrase secrète n'est pas appelé:Utilisation du rappel par mot de passe dans ruby ​​gpgme

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) 

Est-ce que quelqu'un a un exemple de rappel de phrase de passe?

Répondre

3

Exemple de rappel que vous pouvez trouver dans l'exemple de travail suivant. Il signe un fichier en mode détaché, c'est-à-dire que le fichier de signature est séparé du fichier d'origine. Il utilise le trousseau de clés par défaut à ~/.gnupg ou quelque chose comme ça. Pour utiliser un répertoire différent pour votre trousseau de clés, définissez la variable d'environnement ENV ["GNUPGHOME"] = "" avant d'appeler 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 
3

Voici un autre exemple de travail pour vous qui n'utilise pas de signature détachée. Pour tester cela, il suffit de changer '[email protected]' à l'identifiant de votre clé et faire: GPG.decrypt (GPG.encrypt ('texte',: armure => true))

require 'gpgme' 
require 'highline/import' 

module GPG 
    ENCRYPT_KEY = '[email protected]' 
    @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 

Cheers

- Carl

2

Il est important de noter que de GnuPG 2.0 (et 1.4 lorsque l'option use-agent est utilisée) pinentry est utilisé pour la collecte de mot de passe. Cela signifie que le rappel de phrase secrète gpgme sera not be invoked. Ceci est décrit here et un exemple d'utilisation peut être trouvé dans le gpgme-toolexample.

+0

Merci beaucoup – msanteler

Questions connexes