2012-12-02 5 views
5

Neu in JS, ich lerne auch Crypto-Bibliotheken zu verwenden. Ich verstehe nicht, warum das Signieren/Verschlüsseln derselben Nachricht mit demselben Geheimnis zu unterschiedlichen Ergebnissen führt.jsSHA, CryptoJS und OpenSSL-Bibliotheken geben unterschiedliche Ergebnisse

Ich verwende jsSHA 1.3.1 found here und CryptoJS 3.0.2 described here versucht, eine Base64 Sha-1-codierte hmac Signatur zu erstellen. Hier ist der Code:

In html ...

<script src="lib/jsSHA/src/sha1.js"></script> 
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/hmac-sha1.js"></script> 

Und in js ...

var message = "shah me"; 
var secret = "hide me"; 
var crypto = CryptoJS.HmacSHA1(message, secret).toString(CryptoJS.enc.Base64) + '='; 

var shaObj = new jsSHA(message, "ASCII"); 
var jssha = shaObj.getHMAC(secret, "ASCII", "B64") + '='; 

return "crypto answer is " + crypto + " jssha answer is " + jssha; 

Können Sie mir helfen erklären, warum diese Ergebnisse unterscheiden?

Krypto Antwort ist 3e929e69920fb7d423f816bfcd6654484f1f6d56 = jssha Antwort PpKeaZIPt9Qj + Ba/zWZUSE8fbVY =

ist Was mehr ist, diese beiden unterscheiden sich mit der Unterschrift I in Schienen bin zu erzeugen, wie dies ...

digest = OpenSSL::Digest::Digest.new('sha1') 
raw_signature = OpenSSL::HMAC.digest(digest, "hide me","shah me") 
b64_signature = Base64.encode64(raw_signature).strip 

(würde eine Geige versorgen haben mag, die eine sehr gute gängige Praxis zu sein scheint, aber das auch ist, neu für mich und ich war nicht in der Lage einen für diese Frage arbeiten zu bekommen).

Vielen Dank im Voraus.

Antwort

7

Es gibt 3 Fehler im Code :)

Sie verpassen die enc-base64-min.js für crypto-js. Ohne es wird CryptoJS.enc.Base64undefined sein
Sie fehlen ein Parameter beim Aufruf .getHMAC(). Es ist .getHMAC(secret, secret_type, hash_type, output_encoding)
Mit 1 + 2 Hinzufügen eines = nicht erforderlich ist (noch rechts)

<script src="lib/jsSHA/src/sha1.js"></script> 
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/hmac-sha1.js"></script> 
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/enc-base64-min.js"></script> 

var message = "shah me"; 
var secret = "hide me"; 
var crypto = CryptoJS.HmacSHA1(message, secret).toString(CryptoJS.enc.Base64); 
var shaObj = new jsSHA(message, "ASCII"); 
var jssha = shaObj.getHMAC(secret, "ASCII", "SHA-1", "B64"); 

return "crypto answer is " + crypto + " jssha answer is " + jssha; 

Example

+0

Brilliant, danke! Das funktioniert fast. Ich sehe, es funktioniert perfekt in der jsfiddle, aber die Aktualisierung meines Codes mit Ihren Vorschlägen verließ mich mit zwei Problemen: 1) die jsSHA Readme sagt, um den Namen des Algorithmus weglassen, wenn sha1.js. Ihr Vorschlag auf meinem Localhost erzeugte "undefined format" und erstickte auf "SHA-1" als Ausgabeformat (glaube ich). Ich band dies mit ein, indem ich sa.js anstelle von sha1.js einschloss. Gut genug. Aber härter: (2) auf meinem Rig, kryptographisch angehängt das '=', aber jsSHA nicht. Die sigs sind jedoch die gleichen, also bin ich schon dankbar für deine großartige Antwort! – danh

+0

Ich habe gerade versucht, die js von https: //raw.github.../sha1.js wie Sie auf jsfiddle getan. Das macht jetzt ein perfektes Ergebnis. Also nochmal danke. Mein aktuelles Projekt hat die js lokal kopiert nach dem Download der 1.3.1. Ich werde dies korrekt (und +1) markieren. Kannst du mich wissen lassen, was die richtige Übung ist, um eine Lib wie Jssha einzuschließen? – danh

+0

Eine schnelle Suche zeigte kein CDN, das diese lib hostet, also würde ich mit einer lokalen Kopie gehen. – Andreas

Verwandte Themen