2010-07-08 4 views
7

Ho lo stesso problema: Can SHA-1 algorithm be computed on a stream? With low memory footprint?Attuazione SHA1 JavaScript per stringa di grandi dimensioni

Sto cercando un'implementazione di JavaScript che calcola blocco per blocco di una stringa di grandi dimensioni. L'idea è di dividere la stringa in blocchi da 512 bit e bloccarla per blocco.

Qualche suggerimento?

[Aggiornamento] Grazie di sunetos di aiuto, io scrivere la sceneggiatura litte HTML5 java app: Generate SHA1 File Checksum Using HTML5 File API in Javascript

risposta

4

Credo mi sono imbattuto in uno di Paul Johnston a http://pajhome.org.uk/crypt/md5/contrib/sha1_stream.js. È elencato nella pagina http://pajhome.org.uk/crypt/md5/scripts.html. Non l'ho provato da solo, ma ho usato la sua versione non-streamable che ha modificato per questo.

AGGIORNAMENTO: Ecco alcuni esempi di codice (l'ho verificato su un SHA1 separato noto per essere corretto). Assicurati di includere lo sha1.js originale (trovato a http://pajhome.org.uk/crypt/md5/sha1.js) prima dello stream sha1_stream.js.

<script src="sha1.js" type="text/javascript" charset="utf-8"></script> 
<script src="sha1_stream.js" type="text/javascript" charset="utf-8"></script> 

<script type="text/javascript" charset="utf-8"> 

    var input = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'; 

    var blocksize = 512; 
    var h = naked_sha1_head(); 
    for (var i = 0; i < input.length; i += blocksize) { 
     var len = Math.min(blocksize, input.length - i); 
     var block = input.substr(i, len); 
     naked_sha1(str2binb(block), len*chrsz, h); 
    } 
    var result = binb2hex(naked_sha1_tail(h)); 

</script> 
+0

Grazie sunetos. Immagino che questo sia quello che voglio. Ma non c'è nessun documento né esempio per mostrare come usarlo. Mi potete aiutare? –

+0

Appena aggiornato per mostrare un esempio di come usarlo. – sunetos

+0

Si noti che la versione corrente di sha1_stream.js ha un bug e darà risultati errati per determinate lunghezze di input. Per risolvere questo problema sostituisci 'h [8] + = 512 - len% 512;' con 'h [8] = (len + 576 >> 9) << 9;' - si dimentica di includere il padding durante l'arrotondamento a un multiplo di 512 bit. La versione non streaming non ha quell'errore. – Zarat