WebCrypto
İstemci tarafı (tarayıcı) javascriptindeki şifreleme ile ilgili endişeler aşağıda detaylandırılmıştır. Bu endişelerden biri hariç tümü , şu anda oldukça iyi desteklenen WebCrypto API için geçerli değildir .
Çevrimdışı bir uygulama için güvenli bir anahtar deposu tasarlamanız ve uygulamanız gerekir.
Kenara: Node.js kullanıyorsanız yerleşik kripto API'sını kullanın .
Yerel Javascript Şifrelemesi (WebCrypto öncesi)
Birincil endişenin localStorage
sitenizi okuyan bilgisayara fiziksel erişimi olan birinin olduğunu ve kriptografinin bu erişimi önlemeye yardımcı olmasını istediğinizi varsayıyorum.
Birinin fiziksel erişimi varsa, başka saldırılara da açıktır ve okumaktan daha kötüdür. Bunlar aşağıdakileri içerir (ancak bunlarla sınırlı değildir): keylogger'lar, çevrimdışı komut dosyası değişikliği, yerel komut dosyası enjeksiyonu, tarayıcı önbellek zehirlenmesi ve DNS yönlendirmeleri. Bu saldırılar yalnızca kullanıcı makineyi tehlikeye girdikten sonra kullanırsa çalışır. Bununla birlikte, böyle bir senaryoda fiziksel erişim, daha büyük sorunlarınız olduğu anlamına gelir.
Bu nedenle, yerel kriptonun değerli olduğu sınırlı senaryonun, makinenin çalınması olacağını unutmayın.
İstenilen işlevselliği uygulayan kütüphaneler vardır, örneğin Stanford Javascript Crypto Library . Bununla birlikte, doğal zayıflıklar vardır (@ ircmaxell'in cevabından bağlantıda belirtildiği gibi):
- Entropi eksikliği / rasgele sayı üretimi;
- Güvenli bir anahtar deposu eksikliği, yani özel anahtar yerel olarak saklanıyorsa veya sunucuda saklanıyorsa (çevrimdışı erişimi engelleyen) şifre korumalı olmalıdır;
- Güvenli silme eksikliği;
- Zamanlama özelliklerinin olmaması.
Bu zayıflıkların her biri bir kriptografik uzlaşma kategorisine karşılık gelir. Başka bir deyişle, adıyla "kripto" sahibi olabilirsiniz, ancak uygulamada istediği titizliğin çok altında olacaktır.
Tüm söylenenler, aktüeryal değerlendirme "Javascript kripto zayıftır, kullanmayın" kadar önemsiz değildir. Bu bir onay, kesinlikle bir uyarı değildir ve yukarıdaki zayıflıkların maruz kalmasını, karşılaştığınız vektörlerin sıklığını ve maliyetini ve arıza durumunda hafifletme veya sigorta kapasitenizi tamamen anlamanızı gerektirir: Javascript kripto, zayıflıklarına rağmen, maruziyetinizi azaltabilir, ancak sadece sınırlı teknik kapasiteye sahip hırsızlara karşı. Ancak, Javascript kriptosunun bu bilgileri hedefleyen kararlı ve yetenekli bir saldırgana karşı hiçbir değeri olmadığını varsayalım. Bazıları, uygulamanın pek çok zayıflığının bilindiği durumlarda verilerin "şifreli" olarak adlandırılmasının yanıltıcı olduğunu düşünmektedir. Diğer bir deyişle, teknik riskinizi marjinal olarak azaltabilirsiniz ancak finansal riskinizi ifşadan arttırırsınız. Elbette her durum farklıdır - ve finansal risklere maruz kalmanın teknik olarak azaltılmasının analizi önemsizdir. İşte açıklayıcı bir benzetme:Bazı bankalar , doğası gereği riske rağmen zayıf parolalara ihtiyaç duyarlar , çünkü zayıf parolalardan kaynaklanan kayıplara maruz kalma, güçlü parolaları desteklemenin son kullanıcı maliyetlerinden daha azdır.
🔥 Son paragrafı okuduysanız ve "İnternette Brian adlı bir adam Javascript kripto kullanabileceğimi söylüyor" diye düşündüyseniz, Javascript kripto kullanmayın.
Soruda açıklanan kullanım durumu için, kullanıcıların yerel bölümlerini veya ana dizinlerini şifrelemesi ve güçlü bir şifre kullanması daha anlamlı görünmektedir. Bu tür bir güvenlik genellikle iyi test edilmiş, yaygın olarak güvenilir ve yaygın olarak bulunmaktadır.