Szukam sposobu na wykonywanie kryptografii po stronie klienta w JavaScript (pamiętając o http://www.matasano.com/articles/javascript-cryptography/) i znalazłem SJCL. Ale nie mogę znaleźć dla niego dobrych przykładów kodu. Jakieś wskazówki?Dobre przykłady bibliotek Crypto Library (SJCL) dla Stanforda Javascriptu? (Kryptografia JS)
Odpowiedz
zrobiłem prezentację w ubiegłym roku pod tytułem Developer's Guide to JavaScript and Web Cryptography i mieć witrynę online demo na https://jswebcrypto.azurewebsites.net/
Obejmuje to proste Hash, HMAC, PBKDF2 i AES przykłady wiersza poleceń OpenSSL (jako punkt odniesienia) SJCL, CryptoJS, Node.js Crypto, a nawet W3C Web Cryptography API
Oto przykłady SJCL:
Hash
var out = sjcl.hash.sha1.hash("The quick brown fox jumps over the lazy dog");
var hash = sjcl.codec.hex.fromBits(out)
// "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12"
HMAC
var key = sjcl.codec.utf8String.toBits("key");
var out = (new sjcl.misc.hmac(key, sjcl.hash.sha256)).mac("The quick brown fox jumps over the lazy dog");
var hmac = sjcl.codec.hex.fromBits(out)
// "f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8"
PBKDF2
var hmacSHA1 = function (key) {
var hasher = new sjcl.misc.hmac(key, sjcl.hash.sha1);
this.encrypt = function() {
return hasher.encrypt.apply(hasher, arguments);
};
};
var passwordSalt = sjcl.codec.hex.toBits("cf7488cd1e48e84990f51b3f121e161318ba2098aa6c993ded1012c955d5a3e8");
var derivedKey = sjcl.misc.pbkdf2("password", passwordSalt, 100, 256, hmacSHA1);
var hexKey = sjcl.codec.hex.fromBits(derivedKey);
// c12b2e03a08f3f0d23f3c4429c248c275a728814053a093835e803bc8e695b4e
Uwaga: Wymaga to w to sha1.js oprócz sjcl.js.
To może być trochę za późno, ale ja również ostatnio szukałem sposobu na wykonywanie kryptograficznych haszy po stronie klienta, a answer by Kevin Hakanson był bardzo pomocny, strona demo jest również bardzo przydatna! Pokazuje, jak używać niestandardowej funkcji PseudoRandom z PBKDF2 (HMAC i SHA1), ale doszedłem do wniosku, że jeśli nie zostanie przekazany, SJCL ma ustawienia domyślne i chciałem po prostu pokazać, jak to zrobić, wraz z generowaniem losowej soli .
Znalazłem także pomocny sjcl docs.
Aby wygenerować losowy sól i używać PBKDF2 na hasło „password”, można to zrobić, który kończy się tylko 3 linie:
// Each random "word" is 4 bytes, so 8 would be 32 bytes
var saltBits = sjcl.random.randomWords(8);
// eg. [588300265, -1755622410, -533744668, 1408647727, -876578935, 12500664, 179736681, 1321878387]
// I left out the 5th argument, which defaults to HMAC which in turn defaults to use SHA256
var derivedKey = sjcl.misc.pbkdf2("password", saltBits, 1000, 256);
// eg. [-605875851, 757263041, -993332615, 465335420, 1306210159, -1270931768, -1185781663, -477369628]
// Storing the key is probably easier encoded and not as a bitArray
// I choose base64 just because the output is shorter, but you could use sjcl.codec.hex.fromBits
var key = sjcl.codec.base64.fromBits(derivedKey);
// eg. "2+MRdS0i6sHEyvJ5G7x0fE3bL2+0Px7IuVJoYeOL6uQ="
Jeśli chciał przechowywać sól, prawdopodobnie chcesz kodować to
var salt = sjcl.codec.base64.fromBits(saltBits);
// eg. "IxC/6ZdbU/bgL7PkU/ZCL8vAd4kAvr64CraQaU7KQ3M="
// Again I just used base64 because it's shorter, but you could use hex
// And to get the bitArray back, you would do the exact opposite
var saltBits = sjcl.codec.base64.toBits(salt);
Ta strona z przykładami jest naprawdę przydatna, dziękuję! Ponadto, jeśli pominiesz funkcję hmacSHA1 i nie przekażesz jej jako argumentu, domyślnie użyjesz hmac SHA256. – janka102
@ kevin-hakanson Podczas czytania odpowiedzi zauważyłem, że w przykładowej funkcji 'PBKDF2'' hmacSHA1' nic nie robi - ten sam klucz jest zwracany zarówno zi bez niego - http://jsfiddle.net/2802m8n5/. Czy możesz powiedzieć, dlaczego to się dzieje? – Shtirlits
Zaktualizowano Fiddle (http://jsfiddle.net/2802m8n5/1/), aby dołączyć sha1 (nie jest częścią sjcl.js) https://github.com/bitwiseshiftleft/sjcl/blob/master/core/sha1.js –