2013-03-14 14 views
8

Questa è una domanda strana, ma ci sto lavorando da ore e non sto facendo molti progressi. Spero che qualcuno qui possa essere in grado di consigliare ...(Not-so) Il tasto Clever sta causando problemi con SHA512 Hmac nel nodo JS

Sto eseguendo il porting di uno script da php a node. Lo script PHP fa uso di questa funzione:

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

ho riprodotto questo nodo utilizzando il modulo crypto:

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

Ho verificato che queste funzioni producono lo stesso hash quando dato lo stesso testo e chiave.

Tranne ...

La stringa che viene utilizzato per una chiave in php è simile a questo: (Non chiedere)

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

"); 

ho cercato di riprodurre questo in Javascript come così:

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

Ma non funziona. (Presumo che deve avere qualcosa a che fare con le interruzioni di riga).

Sostituzione delle nuove righe con "\ r \ n" o "\ n", come in seguito anche non funziona:

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

Suggerimenti su come risolvere questo problema? (Sbarazzarsi del cane non è un'opzione, purtroppo.)

Grazie (in anticipo) per il vostro aiuto.

+4

Questa è la mia nuova domanda preferita su Stack Overflow. – Bill

+0

La differenza tra la chiave reale e quella incollata che la chiave reale ha "long dog is long" è scritta nel mezzo? – hobbs

+1

Come hai detto, la chiave non è * esattamente * la stessa ... ma i doppi battiti letterali sono diversi tra i due cani. In PHP il \\ vicino alla coda del cane viene interpretato come una letterale barra retroversa.L'orecchio vicino al cane viene interpretato come un letterale backslash e un trattino basso. Prova base64! :-) – MrTrick

risposta

3

Perché non memorizzare la stringa codificata BASE64? In questo modo non devi preoccuparti delle interruzioni di riga, degli spazi bianchi o di qualcosa del genere.

Visto che il codice php sta memorizzando la chiave (apparentemente) in modo corretto, provare uno script come:

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

eseguirlo dalla riga di comando, copiare la chiave codificata, quindi utilizzare nel vostro javascript. La decodifica delle stringhe base64 è un problema semplice, ad esempio; Base64 encoding and decoding in client-side Javascript

+0

evviva! Questo è stato. Grazie! – user1031947

0

provare a sostituire tutte le nuove righe nella versione PHP con \n (senza andare a capo) nella versione JS. Se ciò non funziona, prova a sostituirli tutti con \r\n - Scommetto che PHP non traduce letterali multilinea in formato Windows formattato :)

+0

grazie - L'ho già provato e purtroppo non ha funzionato. Aggiornerò la mia domanda per menzionarlo. – user1031947

1

Non ci sono interruzioni di riga nella stringa originale, per quanto ne so. Il backslash alla fine dice a PHP che la riga successiva è solo una continuazione della precedente. Per verificare se ho ragione o no, potresti ottenere PHP per stampare la stringa e vedere se contiene interruzioni di riga. Ma sospetto che tu possa scrivere questo in una stringa lunga, o unita, in Javascript.

Problemi correlati