2016-07-20 12 views
1

anlegen würde Ich mag dieses Unix-Skript o Rubin migrieren:eine digitale Signatur in Ruby ohne Kommandozeile

echo -n "loremipsum" | openssl dgst -md5 -hex -sign keys/#02299991.privKey.pem 

Das Ergebnis ist folgendes:

(stdin)= 08d9d6496a5146bc1955ad35c884e3b843d441eebc9ed7908b220e9414132dad57dc0f4744e5ec4a9a819e20f4099e2c90186b4684b3b52d1409dd4ca5bc86e7c16dbb64e6cf41d695a7e979744616fe92e5347a7acbb1e1da902d3cfc629927adf3e119f33d2cbc89f90f9494d44becbf93855d09460a67e2615e7d8df7e4f8 

ich folgendes bin mit Code:

key = OpenSSL::PKey::RSA.new(File.read("keys/#02299991.privKey.pem")) 
md5_hash = Digest::MD5.hexdigest 'loremipsum' # result: 65a73f29730d3519bd7dd98ab954ed56 
key.private_encrypt md5_hash 

Und das ist das Problem private_encrypt wird, erzeugt eine ganz andere Hash von dem einen, die ich mit Co erzeugt mmand line:

"B62\xDA\x80\xF9\xFF]\xCE;\a\xB3)fC\xA8v\x9EM5\xF8Z\xA9\x00\b\xA4\x95 \x84\x8A\xD6:\xDA\xCE\x1D\x01\x9F&\xEB\xD5\xD6\xDF\xC0\v\xD8i\xA0\x86\x8E\e`\x98\xB9\x19\xEC\xA7\x8A\\.\xD1\xCC\xFC\x93\x1C\xFF\xFFh\xAFw\t\xFF\xC8Z\xEC\xBDP\x9C_\x03%\x85:\x04\x1C=\xF3\xAC\xE1\x917TO\x94\xB2\x9Fd`3\x98\x04\x93\xBFS\\\xD1Z\xF9\xBD\x91\xE3\xA1:\xA3B22U_FI'`0i\x8D(\x9B`" 

was ist los?

+1

Ihr 'openssl'-Befehl erzeugt einen signierten MD5-Digest aus den Daten. Ihr Ruby-Code erzeugt einen (unsignierten) MD5-Digest und verschlüsselt dann den Hex-Digest mit RSA. Das sind wirklich verschiedene Dinge. –

Antwort

2

Ihr Befehl openssl und Ihr Ruby-Code machen sehr unterschiedliche Dinge. Ihr openssl Befehl sagt "generieren Sie einen MD5-Digest, der mit meinem RSA-Schlüssel signiert wurde, und drucken Sie es in Hex-Format." Ihr Ruby-Code sagt: "Generiere einen (unsignierten) MD5-Digest im Hex-Format und verschlüssele ihn dann mit meinem RSA-Schlüssel." Digest-Generierung und -Verschlüsselung sind nicht dasselbe und führen nicht zu demselben Ergebnis.

RUBY entspricht Ihren openssl Gebot:

data = 'loremipsum' 
digest = OpenSSL::Digest::MD5.new 
pkey = OpenSSL::PKey::RSA.new(File.read("keys/#02299991.privKey.pem")) 
signature = pkey.sign(digest, data) 
hex_signature = signature.unpack('H*').first 

Die ersten vier Zeilen für OpenSSL::PKey::PKey#sign praktisch wörtlich aus der Dokumentation sind. Diese Methode gibt eine binäre Zeichenfolge zurück (ich konnte keine Möglichkeit finden, eine Hex-Zeichenfolge direkt zu erhalten; wenn jemand einen Weg kennt, hinterlasse bitte einen Kommentar), so müssen wir String#unpack verwenden, um ihn in eine Hex-Zeichenfolge umzuwandeln. (unpack gibt ein Array zurück, ergo .first.)