2013-03-14 38 views
8

Đây là một câu hỏi kỳ quặc, nhưng tôi đã làm việc này trong nhiều giờ và không tiến bộ nhiều. Tôi hy vọng ai đó ở đây có thể tư vấn ...(Không phải như vậy) Phím thông minh đang gây ra vấn đề với SHA512 Hmac trong Node JS

Tôi đang chuyển một tập lệnh từ php sang nút. Các kịch bản php tận dụng chức năng này:

hash_hmac('sha512', $text, $key); 

tôi đã sao chép này trong nút bằng cách sử dụng mô-đun crypto:

var hash = crypto.createHmac("sha512", key); 
hash.update(text); 
return hash.digest("hex"); 

Tôi đã xác minh rằng các chức năng sản xuất các hash tương tự khi cho cùng văn bản và Chìa khóa.

Trừ ...

Chuỗi đang được sử dụng cho một chìa khóa trong php trông giống như thế này: (Đừng hỏi)

define("SITE_KEY", " 
              __ 
    ,         ,' e`---o 
    ((         ( | ___,' 
    \\~-------------------------------' \_;/ 
    (         /
    /) ._______________________________. ) 
    (((        ((( 
    ``-'        ``-' 

"); 

Tôi đã cố gắng để tái sản xuất này trong Javascript như như vậy:

var key = "\ 
              __\ 
    ,         ,' e`---o\ 
    ((         ( | ___,'\ 
    \\\\~-------------------------------' \\_;/\ 
    (         /\ 
    /) ._______________________________. )\ 
    (((        (((\ 
    ``-'        ``-'\ 
\ 
"; 

Nhưng nó không hoạt động. (Tôi cho rằng nó phải có một cái gì đó để làm với các linebreaks).

Thay thế dòng mới với "\ r \ n" hoặc "\ n" như trong những điều sau đây cũng không hoạt động:

var key = "\r\n           __\r\n  ,         ,' e`---o\r\n ((         ( | ___,'\r\n  \\\\~-------------------------------' \\_;/\r\n  (         /\r\n  /) ._______________________________. )\r\n (((        (((\r\n  ``-'        ``-'\r\n\r\n"; 

Gợi ý về làm thế nào để sửa lỗi này? (Loại bỏ con chó không phải là một lựa chọn, thật không may.)

Cảm ơn (trước) để được giúp đỡ của bạn.

+4

Đây là câu hỏi yêu thích mới của tôi về Stack Overflow. – Bill

+0

Sự khác nhau giữa khóa thực và khóa bạn đã dán là khóa thực có "long dog is long" được viết ở giữa không? – hobbs

+1

Như bạn đã nói, chìa khóa không phải là * chính xác * giống nhau ... nhưng các dấu gạch chéo ngược lại khác nhau giữa hai con chó. Trong PHP, \\ gần đuôi chó được hiểu là một dấu gạch chéo ngược chữ.Các \ _ gần tai chó được hiểu là một dấu gạch chéo ngược chữ và dấu gạch dưới. Hãy thử base64! :-) – MrTrick

Trả lời

3

Tại sao không lưu trữ chuỗi BASE64 được mã hóa? Bằng cách đó bạn không cần phải lo lắng về ngắt dòng, khoảng trắng, bất cứ điều gì như thế.

Thấy như mã php của bạn được lưu trữ chìa khóa (dường như) một cách chính xác, hãy thử một kịch bản như:

<? 
$doggy_key = ....; 
echo base64_encode($doggy_key); 

Run nó từ dòng lệnh, sao chép chìa khóa mã hóa, sau đó sử dụng nó trong javascript của bạn. Giải mã chuỗi base64 là một vấn đề đơn giản, ví dụ; Base64 encoding and decoding in client-side Javascript

+0

hurray! Điều đó đã làm điều đó. Cảm ơn! – user1031947

0

Thử thay thế tất cả các dòng mới trong phiên bản PHP bằng \n (và không có dòng mới) trong phiên bản JS. Nếu điều đó không hiệu quả, hãy thử thay thế tất cả bằng \r\n - Tôi đặt cược PHP không dịch các chữ nhiều màu trong nguồn được định dạng theo cửa sổ :)

+0

cảm ơn - Tôi đã thử điều đó rồi, và tiếc là nó cũng không hoạt động. Tôi sẽ cập nhật câu hỏi của tôi để đề cập đến điều này. – user1031947

1

Không có ngắt dòng trong chuỗi gốc, theo hiểu biết của tôi. Dấu gạch chéo ngược ở cuối cho PHP biết rằng dòng tiếp theo chỉ là sự tiếp nối của trước đó. Để kiểm tra xem tôi có đúng hay không, bạn có thể lấy PHP để in ra chuỗi và xem liệu nó có ngắt dòng trong đó hay không. Nhưng tôi nghi ngờ rằng bạn có thể viết điều này trong một chuỗi dài hoặc tham gia bằng Javascript.