Web programcıları kriptografi hakkında ne bilmeli? [kapalı]


27

Web siteleri / web uygulamaları oluşturan programcılar kriptografiyi anlamalı mıdır? Çoğu kriyografik algoritmanın nasıl çalıştığını bilmiyorum ve md5 / des / aes / etc arasındaki farkları gerçekten anlamıyorum. Herhangi biriniz derinlemesine bir şifreleme anlayışı için bir ihtiyaç duydu mu?

İhtiyacım olmadı, ama merak ediyorum belki bir şeyleri özlüyorum. Şifreleri şifrelemek için salt + md5 hash kullandım ve web sunucularına SSL kullanmalarını söyledim. Bunun ötesinde, başka bir şey kullandığımı söyleyemem ya da bu yöntemlerin ne kadar güvenli olduğunu kesin olarak söyleyemem . Sadece onları kullanıyorum çünkü diğer insanlar güvende olduklarını iddia ediyorlar.

Bu iki basit örnekten başka, web programlamada kriptografi kullanmaya hiç ihtiyaç duydunuz mu?


4
Yapmamaları gerektiğini bilecek kadar bilmeleri gerekir.
SLaks

@SLaks: +1% 100 katılıyorum. Bunun nedenini genişletmek için bu konuya bir cevap yazdım.
Chris Jester-Young,

Yanıtlar:


41

Web programcıları asla kriptografiyi kendileri uygulamaya asla denememeleri gerektiğini bilmelidir .

Özellikle, bu hiçbir güvenlik uzmanının şifreleme ilkelerinin hiçbirine doğrudan dokunmaması gerektiği anlamına gelir. AES, SHA-1 vb. Seviyelerinde düşünmemeliler. Bunun yerine, mesajları şifrelemek, imzalamak ve şifreleri "hash" yapmak için üst düzey işlevler kullanmaları gerekir.

Niye ya? Çünkü aksi takdirde, insanlar şunu düşünerek yanlış yönlendirilir:

  • AES-256, ECB modunda kullandıkları veya rastgele olmayan IV değerleri vb. Kullandıkları gerçeğine rağmen, "mükemmel şifreleme" dir. (Bazı modlarda, rastgele olmayan ancak benzersiz IV'ler iyidir. çok fazla.)
  • Birden fazla mesajı şifrelemek için aynı simetrik anahtarı kullanabilirler (veya daha kötüsü, simetrik anahtarı doğrudan kullanım için kodda saklarlar).
    • Anahtar türetme işlevlerini kullanmadan doğrudan bir anahtar olarak bir parola kullanmaya bile karar verebilirler.
  • Verileri doğrudan şifrelemek için RSA'yı kullanabilirler.
  • Güvende olmaları için şifrelerini "tuzlandırabilir ve MD5" kullanabilirler. (Gökkuşağı tablolarının en zayıf halka olduğunu düşünüyorsanız, tekrar düşünün .)

Sadece aynı sayfada olmak için yukarıdaki öğelerin hiçbiri tamam değil . Bunu anlamıyorsan, 10 metrelik bir direkle kriptoya dokunmamalısın! (AES-256 olan düzgün kullanmak sadece ama eğer, büyük bir şifreleme. "Bu konular, bu onu ne olduğunu boyutu değil." :-))

Ne tür üst düzey işlevlerden bahsediyorum? Kişisel olarak bir OpenPGP (durgun veriler için) veya SSL (hareket halindeki veriler için) kütüphanesinin kullanılmasını tavsiye ederim. Bu protokoller, asimetrik, simetrik ve karma algoritmaların doğru kullanımını kesin olarak belirtir. Örneğin, OpenPGP ile:

  • Verileri doğrudan şifrelemek için RSA kullanmaz, bunun yerine mesaj başına rastgele bir oturum (simetrik) anahtarı oluşturur (bu önemlidir) ve bu oturum anahtarını şifrelemek için RSA'yı kullanır.
  • Parolaları anahtarlara dönüştürmek için bir anahtar türetme işlevi kullanır. (OpenPGP parlance olarak buna S2K denir, ancak bence "anahtar türevlendirme işlevi" daha standart bir terimdir.)
  • İyi bir mod seçmeyi kullanır, böylece ECB kullanmaya asla son vermezsiniz.
  • Anahtar yönetimini sizin için yönetir, bu nedenle hangi anahtarların güvenilir olduğu konusunda geçici kararlar vermek zorunda değilsiniz.

Özet: Bir güvenlik uzmanı değilseniz ve AES veya SHA-1 veya (cennet yasağı) MD5 düzeyinde düşünüyorsanız, yanlış yapıyorsunuz . Güvenlik uzmanları tarafından yazılmış (Bouncy Castle gibi), güvenlik uzmanları tarafından tasarlanan protokolleri (şifreleme için OpenPGP veya şifreleme için bcrypt veya scrypt gibi) uygulayan bir kütüphane kullanın.

Hiçbir şekilde bir kripto uzmanı değilim, ancak kendi geçici protokollerimi tasarlamamaya çalışacağımı biliyorum. Sadece açık olmak gerekirse, bu yazının tamamı Kriptografi 101 malzemesidir . Bu yazı% 100 size mantıklı gelmiyorsa, o zaman kesinlikle kriptografinin yanına yaklaşmamalısınız.


4
müthiş. blog yazısını "tekrar düşün" bağlantısına ekledi. chargen.matasano.com/chargen/2007/9/7/…
davidhaskins

+1, ancak aynı simetrik anahtarı birden çok kez kullanmak iyi. IV bunun için var (aksi takdirde ihtiyacınız olmaz).
orip

1
Ek olarak, Colin Sccript (ve diğer) şöhretlerin Percival'ında yapmanız gereken ekmek ve tereyağı kripto kararlarını ortaya koyan "Cryptographic Right Answer" adlı harika bir makale var. SSL çok sorunlu (anahtar iptali yapmak çok zor). Daha fazla bilgi burada: daemonology.net/blog/…
orip

@orip Kabul ediyorum, ancak aynı anahtarı farklı bir IV ile kullanmanın, mesajınızın seçtiğiniz simetrik şifrenin blok boyutundan daha uzun olduğu durumlar için daha yararlı olduğunu söyleyebilirim. Önceki iletilerde kullanılan IV'lerin izlenmesi için bağlam. Ayrıca, Colin Percival'in makalesine katılıyorum.
Chris Jester-Young,

1
@ Sevinç Bağlantıyı daha alakalı bir şeyle değiştirdim.
Chris Jester-Young

14

Kriptografi ile ilgili temel bilgilerin dışında bir şey bilmenize gerek yok (bu bir karmaşa, tuz nedir, kabaca bu şifrelemeyi ya da böyle bir şeyi kırmanın ne kadar zor olduğunu), genel.

Bir web geliştiricisi olarak kesinlikle dikkat etmeniz gereken ana güvenlik alanları:

  1. SQL enjeksiyonu Bu, muhtemelen bir web geliştiricisinin bir sistemde açabileceği en tehlikeli deliktir.
  2. Siteler arası komut dosyası oluşturma ve tanımlama bilgileri.
  3. Spambotlar ve captchas.
  4. SQL enjeksiyonu Bunun ne kadar önemli olduğu yeterince vurgulanamaz.

Yaptıklarınız hakkında hiçbir şey anlamamak çok tehlikelidir. Bir mesaj özeti karması ile bir kriptografik karışma arasındaki farkın sizi mahvedebileceğini bilmemek. Nasıl tuzlanacağını bilmemek seni mahvedebilir.
gizli

@ user1525 Kriptografinin temelleri olarak kastettim. Herhangi bir şifreleme algoritmasının gerçekte nasıl çalıştığını bilmenize gerek yoktur.
biziclop

Yanıtı takdir ediyorum ve SQL enjeksiyonu ve diğer saldırılar konusunda hemfikirim, ama gerçekten kriptografi hakkında sorular soruyordum.
davidhaskins

2
@davidhaskins Evet, sadece değer vermeyi düşündüm, çünkü her seviye bir öncekine dayanıyor. AES'in nasıl çalıştığını bilmek, uygulamanızı daha temel bir düzeyde güvenceye almazsanız hiçbir işe yaramaz. Tecrübelerime göre bu, birçok geliştiricinin şifrelemeye konsantre olmak ve uzun güvenlik zincirindeki rolünü gözden kaçırmak (birkaç kez yaptım) içine girmesi.
biziclop

4

Her konuşmacının Güvenlik ve Bilinmesi Gerekenler Hakkında Bilmeniz Gerekenler adlı konuşmayı hatırladığımı hatırlıyorum , konuşmacı Neil Daswani ve verdiği bir Google Teknik Konuşması, başlamak için iyi bir yer olabilir!

Yine de sadece Web Programcılarına uygulanmaz, belki de soruyu “Programlayıcılar güvenlik hakkında ne bilmeli?” Şeklinde yeniden adlandırılmalıdır. Kriptografi ile ilgili temel bilgilerden daha fazlasını bilmeye ihtiyaçları olmadığı için (olduğu kadar ilginç)


2

Kripto birçok durumda kullanışlı olur. Kullandığımız bir örnek, bir LAMP ana bilgisayarında kullanılmak üzere bir Win / IIS ana bilgisayarı tarafından oluşturulan ve ayarlanan bir oturum tanımlama bilgisini şifrelemek.

Eğer şifreleme yapacaksanız (md5 / sha1 karma değerinin aksine), bazı temel terimler önemlidir - örneğin simetrik ve asimetrik şifreleme arasındaki fark gibi. İkisi arasındaki farkı anlamanın yanı sıra, web geliştiricisinin şifre çözme anahtarlarını uygun şekilde saklamak ve güvence altına almak için ne yapmanız gerektiğine dair bir anlayış geliştirmelisiniz. Örneğin, üzerinde tam bir yönetici kontrolüne sahip olmayan bir ana bilgisayarda konuşlandırılacak bir uygulama geliştirmek, paylaşılan bir ana bilgisayar gibi, tüm yöneticilerin tanındığı ve güvenildiği bir sunucuya dağıtmak.


2

Benim düşünceme göre, şifrelemeyle ilgili herşeyi bilmelisin, koduna saldıran biri bilecek Haşhaşları, tuzu, rastgele olmayan rasgeleliği, ana şifreleme algoritmalarını (RSA, 3DES, AES vb.), SHA-1 / MD-5 / et al. Onları ezberlemek zorunda değilsiniz, ama en azından bir karma algoritmanın etkinliğini ve onu nasıl daha güçlü hale getireceğinizi bilmelisiniz. Çarpışmaların ve yanlış pozitiflerin ne olduğunu bilmelisin. Şifreleme algoritmalarını okuyamamalısınız, ancak hangi senaryolar için ideal olan karşılaştırma ölçütlerini bilmelisiniz. Simetrik ve asimetrik şifrelemeyi tanımlayabilmeli ve açıklayabilmelisiniz. PKI'nın ne olduğunu ve nasıl kullanıldığını bilmelisiniz. Bir sertifika yetkilisinin ne olduğunu ve sunucularınızla nasıl etkileşim kurduğunu bilmelisiniz.

Her şeyin içini ve dışını bilmek, onun arka planını bilmek kadar önemli değil. Bazı şeylerin ölçütleri nelerdir (ne kadar hızlı, ne kadar güçlü, zayıf yönleri, vb.).

Bu öneriler, kıdemli veya mimar düzeyinde bilgi içindir. Sadece bir kürek kürek çeken bir web maymunuysanız, bunların hiçbirini bilmenize gerek yok. Mimar bu şeyleri bilmeli. Eğer sitenin sorumlusuysanız, tasarlıyorsanız, uygulıyorsanız, vb ... tüm bu kavramlara aşina olmalısınız ve onlar hakkında akıllıca konuşabilmelisiniz. Bunu öğretmek zorunda değilsin, sadece onunla ilgili bilgileri kabul et ve yay.


2

MD5 yerine şifreleri saklamak için bcrypt (Blowfish) kullanmalısınız ; çok daha yavaş bir algoritmadır , yani bir hacker'ın tahmin etmesi ve kontrol etmesi çok daha zor. Ayrıca, bcrypt bir iş faktörünü parametre olarak alır , yani daha yeni bilgisayarlar tanıtıldıkça daha da yavaşlayabileceği için geleceği kanıtlayan yerleşik bir yapıya sahiptir.

Daha fazla bilgi için bkz. Parola Nasıl Güvenle Saklanır ?


0

Bu tür sorulara oldukça genel bir cevap olarak her zaman yaptığınız şeyle uzaktan ilgili olan her şeyi temel bir anlayışa sahip olmaya çalışmanız gerektiğini düşünüyorum. Elbette üzerinde çalıştığınız şey hakkında ayrıntılı bilgiye ihtiyacınız var. Belirli bir alanın nasıl gelişeceğini, “modada ne olacağını” veya gelecekte neye ihtiyacınız olacağını tahmin etmek çok zordur; birçok kapı açık.

Web programcılığındaki kişisel deneyimim kadar, asimetrik kriptografinin temel kavramlarını ve kaputun altında neler olup bittiğini anlamak için yararlı olan şeyler buldum. Onsuz hayatta kalabilirdim ama kriptografi ve matematikten hoşlandığımı söylemeliyim, öyleyse neden olmasın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.