Scurtă documentație de utilizare sjcl pentru chei de lungime mai mare
Pentru că exemplele date pe pagina de home a bibliotecii Javascript pentru criptare SJCL ( Stanford Javascript Crypto Library ) sunt pentru folosirea cea mai simplă, adică:
sjcl.encrypt("password", "data")
și
sjcl.decrypt("password", "encrypted-data")
am zis să vă dau mai jos niște exemple despre cum se apelează funcțiile alea pentru variantele mai complexe, cu chei de lungi mai mari, includerea de tag-uri și date de autentificare în corpul mesajului criptat pentru verificare gen username/password.
var obiect_de_criptat = {
"numar_cerere":"BR000023",
"solicitant":"Victor Ponta"
};
/**
* vrem să criptăm chestia asta pentru a fi citită doar de utilizatorul vibob cu parola apia2014
* și vrem să folosim cheie de lungime 256 biți ( apelarea default e cu 128 ) și iterații pentru
* număr de iterații pentru calcularea cheii de 5000 de iterații (default este 1000)
* cifrarea este AES și modul de cifrare este ocb2 (ceva mai rapid)
*
*/ mai multe detalii despre chestiile astea găsiți la http://bitwiseshiftleft.github.io/sjcl/demo/
var mesaj_criptat = sjcl.encrypt("apia2014",JSON.stringify(obiect_de_criptat),{adata:"vibob",ks:256,mode:"ocb2",iter:5000});
/*
* șirul de caractere obținut după criptare arată de forma
* "{"iv":"9+bxT91DygsDWLNhxuUc3g==","v":1,"iter":5000,"ks":256,"ts":64,"mode":"ocb2","adata":"vibob","cipher":"aes","salt":"VqYI32WAZwY=","ct":"ebPCMvyV+kithNlYfUY93cKOrduNYrNmCq8Qaos01lrAQEI9rLKnNT7yvNT3rdbftQjs8SI+o6wmcFVcCUmf"}"
* mare atenție , el este STRING și nu OBIECT JSON
*/
// El conține în clar acum șirul pentru autentificare ( vibob ) adică destinatarul pentru a cărui ochi este construit mesajul
// Înainte de a salva datele în fișierul HTML ce va fi vizibil pentru toată lumea, înlocuim acel șir
var mesaj_criptat_pentru_salvare = mesaj_criptat.replace(/"adata":"vibob"/,'"adata":"__USERNAME__"');
// Șirul mesaj_criptat_pentru_salvare îl salvăm în interiorul fișierului pe care-l dăm în HTML, în clar
. . .
// Mai târziu, când se încarcă fișierul în browser și trebuie decriptat
// Punem prima dată pe ecran un dialog cu input-uri din care culegem user_name și user_pass
// și pe butonul de login apelăm funcția de mai jos
function încearcăDecriptare(mesaj_criptat_salvat) {
var succes = false,
mesaj_decriptat = "plm",
mesaj_rezultat = "cioaca",
obiect_decriptat = {},
user_name, user_pass;
try {
// luăm user_name și user_pass din ce introduce el în input-urile din ecranul de login
user_name = $("#user_name").val();
user_pass = $("#user_pass").val();
mesaj_decriptat = sjcl.decrypt(
"user_pass",
mesaj_criptat_salvat.replace(/__USERNAME__/,user_name),
{adata:user_name}
);
// noi știm că am criptat un string JSON al unui obiect JavaScript
obiect_decriptat = JSON.parse(mesaj_decriptat);
if ( typeof obiect_decriptat === undefined || obiect_decriptat === null ) {
mesaj_rezultat = "Eroare la parse";
}
succes = true;
mesaj_rezultat = "decriptare reușită";
} catch (buleala) {
// la eroare de decriptare gagii ies cu excepție, așa se capturează
mesaj_rezultat = "Hai sictir, numele sau parola nu sunt bune!";
console.error("Buleală la decriptare ",buleala);
}
return {
"succes": succes,
"mesaj_rezultat": mesaj_rezultat,
"obiect_decriptat": obiect_decriptat
}
}
Mai jos aveți probele din consola de la Google Chrome:
var obiect_de_criptat = {
"numar_cerere":"BR000023",
"solicitant":"Victor Ponta"
};
obiect_de_criptat
Object {numar_cerere: "BR000023", solicitant: "Victor Ponta"}
var mesaj_criptat = sjcl.encrypt("apia2014",JSON.stringify(obiect_de_criptat),{adata:"vibob",ks:256,mode:"ocb2",iter:5000});
mesaj_criptat
"{"iv":"JtRVAGfQ6MTOdYOuTwUp8g==","v":1,"iter":5000,"ks":256,"ts":64,"mode":"ocb2","adata":"vibob","cipher":"aes","salt":"VqYI32WAZwY=","ct":"ZDMYobYeZ92yuyfZsHwuM/uIucNOMJ5+hBuN6OxuNq1ogQxTg0SCtIWZr6porL93eB6CGyICIMxaeElE5wxu"}"
var mesaj_criptat_pentru_salvare = mesaj_criptat.replace(/"adata":"vibob"/,'__USERNAME__');
mesaj_criptat_pentru_salvare
"{"iv":"9+bxT91DygsDWLNhxuUc3g==","v":1,"iter":5000,"ks":256,"ts":64,"mode":"ocb2","adata":"__USERNAME__","cipher":"aes","salt":"VqYI32WAZwY=","ct":"ebPCMvyV+kithNlYfUY93cKOrduNYrNmCq8Qaos01lrAQEI9rLKnNT7yvNT3rdbftQjs8SI+o6wmcFVcCUmf"}"
console.log("Acum încercăm decriptarea cu diferiți iuzări și parole neștiute")
Acum încercăm decriptarea cu diferiți iuzări și parole neștiute
var mesaj_decriptat = sjcl.decrypt("apia2014",mesaj_criptat_pentru_salvare.replace(/__USERNAME__/,"alexmocioi"),{adata:"alexmocioi"})
CORRUPT: ocb: tag doesn't match (chiar dacă iuzărul alexmocioi știe parola bună, nu se pupă "adata" în mesaj)
var mesaj_decriptat = sjcl.decrypt("numaiștiuparolasămăfutînea",mesaj_criptat_pentru_salvare.replace(/__USERNAME__/,"vibob"),{adata:"vibob"})
CORRUPT: ocb: tag doesn't match (iuzărul vibob nu mai ține minte parola)
var mesaj_decriptat = sjcl.decrypt("apia2014",mesaj_criptat_pentru_salvare.replace(/__USERNAME__/,"vibob"),{adata:"vibob"})
mesaj_decriptat
"{"numar_cerere":"BR000023","solicitant":"Victor Ponta"}"
var obiect_decriptat = JSON.parse(mesaj_decriptat)
obiect_decriptat
Object {numar_cerere: "BR000023", solicitant: "Victor Ponta"}