2012-12-02 42 views
5

Mới đối với JS, tôi cũng đang học cách sử dụng thư viện mã hóa. Tôi không hiểu tại sao ký/mã hóa cùng một thông điệp với cùng một bí mật mang lại kết quả khác nhau.thư viện jsSHA, CryptoJS và OpenSSL cho kết quả khác nhau

Tôi đang sử dụng jsSHA 1.3.1 found hereCryptoJS 3.0.2 described here cố gắng tạo chữ ký hmac được mã hóa base64 sha-1. Dưới đây là các mã:

Trong 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> 

Và trong 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; 

Bạn có thể giúp tôi giải thích tại sao những kết quả khác nhau?

câu trả lời crypto là 3e929e69920fb7d423f816bfcd6654484f1f6d56 = jssha Câu trả lời là PpKeaZIPt9Qj + Ba/zWZUSE8fbVY =

Hơn thế nữa, cả hai khác nhau với chữ ký tôi là tạo ra trong đường ray, như thế này ...

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

(có thể thích cung cấp một câu đố, có vẻ là một thực tiễn phổ biến, nhưng điều đó cũng mới đối với tôi và tôi không thể làm việc cho câu hỏi này).

Xin cảm ơn trước.

Trả lời

7

Có 3 lỗi trong mã của bạn :)

Bạn đang thiếu các enc-base64-min.js cho crypto-js. Nếu không có nó, CryptoJS.enc.Base64 sẽ là undefined
Bạn đang thiếu thông số khi gọi .getHMAC(). Đó là .getHMAC(secret, secret_type, hash_type, output_encoding)
Với 1 + 2 thêm một = là không cần thiết (và cũng không đúng)

<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, cảm ơn bạn! Điều đó gần như hoạt động. Tôi thấy nó hoạt động hoàn hảo trong jsfiddle, nhưng việc cập nhật mã của tôi với các đề xuất của bạn đã để lại cho tôi hai vấn đề: 1) jsSHA readme nói để bỏ qua tên thuật toán khi bao gồm sha1.js. Đề nghị của bạn trên localhost của tôi tạo ra 'định dạng không xác định', nghẹt thở trên "SHA-1" như là một định dạng đầu ra (tôi nghĩ). Tôi đã hỗ trợ nhóm này bằng cách bao gồm sha.js thay vì sha1.js. Đủ tốt. Nhưng khó khăn hơn: (2) trên giàn khoan của tôi, crypto nối thêm dấu '=', nhưng jsSHA thì không. Các hợp đồng giống nhau, mặc dù vậy, vì vậy tôi đã biết ơn câu trả lời tuyệt vời của bạn! – danh

+0

Tôi vừa thử bao gồm các js từ https: //raw.github.../sha1.js như bạn đã làm trên jsfiddle. Làm như vậy bây giờ mang lại cho tôi một kết quả hoàn hảo. Vì vậy, cảm ơn một lần nữa. Dự án hiện tại của tôi có các bản sao được sao chép cục bộ sau khi tải xuống mã zip 1.3.1. Tôi sẽ đánh dấu chính xác (và +1). Bạn có thể cho tôi biết những gì thực hành chính xác là để bao gồm một lib như jssha? – danh

+0

Tìm kiếm nhanh không hiển thị CDN lưu trữ thư viện này vì vậy tôi sẽ sử dụng một bản sao cục bộ. – Andreas

Các vấn đề liên quan