Javascript, HTML, CSS e... !
0 commenti

MD2, MD5, SHA_1, SHA_256, SHA_384, SHA_512

Criptare una stringa con Algoritmo Digest in Google Apps Script

L'esigenza di criptare una stringa, lavorando sul web, è all'ordine del giorno... basti pensare ad un form di registrazione o di login in un sito dove viene richiesta una password che il sistema solitamente, per motivi di sicurezza, dopo il submit del form elabora per criptarla prima di inserirla in un database o confrontarla con un'altra in esso già presente.

In Google Apps Script sono presenti due metodi della Classe Utilities che hanno la finalità di calcolare un digest (Utilities.computeDigest) utilizzando l'algoritmo specificato (ad esempio, Utilities.DigestAlgorithm.MD5) sul valore desiderato. I selettori dei tipi di algoritmo, come specificato nella documentazione relativa a DigestAlgorithm, sono i seguenti: MD2, MD5, SHA_1, SHA_256, SHA_384, SHA_512. L'esempio di questo tutorial prende in considerazione uno dei più noti algoritmi digest, l'MD5.

A scopo informativo, il digest (o impronta) di un determinato messaggio è un numero calcolato a partire da questo messaggio e che ha lunghezza fissa (tipicamente 128 b), un'estrema improbabilità che due messaggi diversi abbiano lo stesso digest e soprattutto non è invertibile ovvero, non esiste un algoritmo noto che, dato un digest, sia in grado di recuperare il messaggio corrispondente (anche se ad oggi per l'MD5 sappiamo che quest'ultima proprietà non è più vera).

Entrando nel vivo della questione, come da documentazione ufficiale, l'ottenimento di un digest MD5 in Google Apps Script di un'ipotetica stringa 'password123' lo si ha con l'applicazione del metodo computeDigest(algorithm, value, charset):

function myFunction() {
  var password = 'password123';
  var res = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5,password,Utilities.Charset.US_ASCII);
  Logger.log(res);
}

C'è tuttavia da fare una segnalazione, ovvero se andiamo ad osservare il log del risultato della conversione del comando di cui sopra noteremo che ha una struttura come la seguente:

[72, 44, -127, 29, -91, -43, -76, -68, 109, 73, 127, -6, -104, 73, 30, 56]

Salta pertanto subito all'occhio che non si tratta di un formato MD5 come siamo solitamente abiuati a vedere (valori a 8 bit nell'intervallo da 0x00 a 0xFF (255)) e questo perchè la rappresentazione in Javascript del digest include sia numeri interi positivi che negativi, di conseguenza non possono essere trattati come caratteri ASCII. Questi valori negativi, quindi, sono solo un'interpretazione errata, ad alto livello, del bit e, per adeguare il risultato agli standard conosciuti, è necessario aggiungere 256 a qualsiasi valore negativo per poi effettuare successivamente la conversione in valore esadecimale.

Il codice seguente mostra un esempio completo che riprende il codice mostrato poco sopra ed effettua, tramite un'apposita funzione, la conversione da decimale ad esadecimale seguendo i passaggi appena descritti:

// Converte il risultato dell'algoritmo Utilities.computeDigest da decimale ad esadecimale
function algorithmDecToEsaConverter(signature) {
  var signatureStr = '';
  for (i = 0; i < signature.length; i++) {
    var byte = signature[i];
    if (byte < 0)
      byte += 256;
    var byteStr = byte.toString(16);
    if (byteStr.length == 1) byteStr = '0'+byteStr;
    signatureStr += byteStr;
  }
  return signatureStr;
}

function myFunction() {
  var password = 'password123';
  var res = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5,password,Utilities.Charset.US_ASCII);
  var result = algorithmDecToEsaConverter(res);
  Logger.log(result);
}

Il risultato a questo punto sarà il seguente:

482c811da5d5b4bc6d497ffa98491e38

Confrontandolo con altri tool online che effettuano la conversione in MD5 di una stringa passata, ad esempio MD5 Hash Generator (ma ce ne sono molti altri in rete), è possibile confermarne l'effettiva avvenuta conversione con successo, Fig. 1:



conversione stringa md5 con tool online

Fig. 1 - Risultato della converisone MD5 ottenuto con un tool online per confronto con quello prodotto in Google Apps Script


Tags

Michele Pisani

Michele Pisani

Sviluppatore Javascript ed esperto in Digital Analytics

L'esperienza nel settore Digital Analytics unita ad anni di sviluppo in Javascript ha trovato la massima espressione in Google Apps Script che mi ha permesso, con estrema facilità e poche righe di codice, di realizzare potenti applicazioni interattive e processi automatizzati integrati con i prodotti della G Suite.

Come contattarmi
scrivi un commento

0 Commenti

Non ci sono commenti

Nessuno ha ancora commentato questo articolo, fallo tu per primo!

scrivi un commento

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato.I campi contrassegnati da un * sono obbligatori
Puoi utilizzare i seguenti tag nei commenti:
[bold]testo[/bold] se vuoi evidenziare un testo con il grassetto[code]function helloworld() { }[/code] se vuoi pubblicare una porzione di codice[url]http://www.appsscript.it[/url] se devi riferirti ad un indirizzo web