SJCL, CryptoJS ve / veya WebCrypto'dan yararlanan mevcut cevaplar mutlaka yanlış değildir, ancak başlangıçta şüphelenebileceğiniz kadar güvenli değildir. Genellikle libsodium kullanmak istersiniz . Önce nedenini sonra nasıl olduğunu açıklayacağım.
Neden SJCL, CryptoJS, WebCrypto, vb?
Kısa cevap: Şifrelemenizin gerçekten güvenli olması için, bu kütüphaneler çok fazla seçim yapmanızı bekler, örneğin blok şifreleme modu (CBC, CTR, GCM; listelediğim üçünden hangisinin güvenli olduğunu söyleyemiyorsanız) Kullanım ve hangi kısıtlamaları altında, istediğiniz bu tür yük olmamalıdır hiç ).
İş unvanınız kriptografi mühendisi olmadığı sürece , oranları güvenli bir şekilde uygulamanıza karşı yığılmış.
Neden CryptoJS'den Kaçının?
CryptoJS bir avuç yapı taşı sunar ve bunları nasıl güvenli bir şekilde kullanacağınızı bilmenizi bekler. Hatta varsayılan olarak CBC moduna ( arşivlenmiş ) geçer.
CBC modu neden kötü?
AES-CBC güvenlik açıkları hakkındaki bu yazıyı okuyun .
WebCrypto'dan Neden Kaçının?
WebCrypto, kriptografi mühendisliğine dik amaçlar için komite tarafından tasarlanan bir potluck standardıdır. Özellikle, WebCrypto'nun güvenlik sağlamak yerine Flash'ın yerini alması amaçlanmıştır .
Neden SJCL'den Kaçının?
SJCL'nin genel API ve belgeleri, kullanıcılara verileri hatırlanan bir şifreyle şifrelemelerini ister. Bu nadiren, eğer varsa, gerçek dünyada yapmak istediğiniz şeydir.
Ayrıca: Varsayılan PBKDF2 yuvarlak sayısı kabaca 86 kat daha küçüktür . AES-128-CCM muhtemelen iyidir.
Yukarıdaki üç seçenekten SJCL'nin gözyaşı ile bitmesi en az muhtemel olanıdır. Ancak daha iyi seçenekler var.
Libsodium neden daha iyi?
Şifreleme modları menüsü, karma işlevleri ve diğer gereksiz seçenekler arasında seçim yapmanız gerekmez. Sen asla Parametrelerinizi berbat ve protokolden tüm güvenlik kaldırarak riske .
Bunun yerine, libsodium size maksimum güvenlik ve minimalist API'ler için ayarlanmış basit seçenekler sunar.
crypto_box()
/ crypto_box_open()
kimliği doğrulanmış ortak anahtar şifrelemesi sunar.
- Söz konusu algoritma X25519 (Curve25519 üzerinden ECDH) ve XSalsa20-Poly1305'i birleştiriyor, ancak güvenli bir şekilde kullanmak için bunu bilmenize (hatta umursamanıza) gerek yok
crypto_secretbox()
/ crypto_secretbox_open()
paylaşılan anahtar kimlik doğrulamalı şifreleme sunar.
- Söz konusu algoritma XSalsa20-Poly1305'tir, ancak bilmenize / bakmanıza gerek yoktur
Ek olarak, libsodium'un düzinelerce popüler programlama dilinde bağlamaları vardır , bu nedenle libsodium'un başka bir programlama yığını ile birlikte çalışmayı denediğinde çalışması muhtemeldir . Ayrıca, libsodium güvenlikten ödün vermeden çok hızlı olma eğilimindedir.
JavaScript Libsodium Nasıl Kullanılır?
İlk olarak, bir şeye karar vermelisiniz:
- Sadece verileri şifrelemek / şifresini çözmek (ve yine de bir şekilde düz metinleri veritabanı sorgularında güvenli bir şekilde kullanmak) ve ayrıntılar hakkında endişelenmek istemiyor musunuz? Veya...
- Belirli bir protokol uygulamanız gerekiyor mu?
Birinci seçeneği seçtiyseniz , olsun CipherSweet.js .
Dokümantasyon çevrimiçi olarak mevcuttur . EncryptedField
çoğu kullanım durumu için yeterlidir, ancak şifrelemek istediğiniz birçok farklı alanınız varsa EncryptedRow
ve EncryptedMultiRows
API'leri daha kolay olabilir.
CipherSweet ile, nonce / IV'ün güvenli bir şekilde kullanmak için ne olduğunu bilmenize bile gerek yoktur .
Buna ek olarak, bu, şifreleme boyutu üzerinden içerikler hakkında gerçekleri sızdırmadan işler int
/ float
şifreleme yapar.
Aksi takdirde, isteyeceksiniz sodyum-artı , çeşitli libsodium sarmalayıcılara kullanıcı dostu bir arayüzü olduğunu. Sodium-Plus, denetlemesi kolay ve nedeni olan performanslı, asenkron, platformlar arası kod yazmanıza olanak tanır.
Sodyum artıyı kurmak için çalıştırın ...
npm install sodium-plus
Şu anda tarayıcı desteği için herkese açık bir CDN yok. Bu yakında değişecek. Ancak, yakalayabilir sodium-plus.min.js
gelen son Github sürümü de gerekirse.
const { SodiumPlus } = require('sodium-plus');
let sodium;
(async function () {
if (!sodium) sodium = await SodiumPlus.auto();
let plaintext = 'Your message goes here';
let key = await sodium.crypto_secretbox_keygen();
let nonce = await sodium.randombytes_buf(24);
let ciphertext = await sodium.crypto_secretbox(
plaintext,
nonce,
key
);
console.log(ciphertext.toString('hex'));
let decrypted = await sodium.crypto_secretbox_open(
ciphertext,
nonce,
key
);
console.log(decrypted.toString());
})();
Sodyum artı belgeleri Github'da bulunabilir.
Adım adım bir eğitici isterseniz , bu dev.to makalesinde aradığınızı bulabilirsiniz.