BCrypt, C # 'da kullanılacak iyi bir karma algoritma mıdır? Nereden bulabilirim? [kapalı]


129

Bir şifreyi karıştırırken, birçok programcının BCrypt algoritmasını kullanmanızı tavsiye ettiğini okudum.

C # ile programlama yapıyorum ve BCrypt için iyi bir uygulama bilen var mı merak ediyorum? Bu sayfayı buldum , ancak sahte olup olmadığını gerçekten bilmiyorum.

Bir şifre karma şeması seçerken nelere dikkat etmeliyim? BCrypt 'iyi' bir uygulama mı?

Yanıtlar:


148

İlk olarak, önemli olan bazı terimler:

Karma - Bir dize alma ve orijinal dizeye geri döndürülemeyen bir dizi karakter üretme eylemi.

Simetrik şifreleme - bir karakter dizisi bir dizi alarak ve üretme hareket - (genellikle sadece 'şifreleme' olarak adlandırılır) için şifreli aynı şifreleme anahtarı kullanılarak özgün dizeye şifresi.

Gökkuşağı Tablosu - belirli bir karma algoritmada karma hale getirilmiş tüm karakter çeşitlerini içeren bir arama tablosu.

Tuz - hashing uygulanmadan önce orijinal dizeye eklenen bilinen rastgele bir dize.

.NET Framework için, Bcrypt henüz doğrulanmış bir referans uygulamasına sahip değildir . Bu önemlidir çünkü mevcut bir uygulamada ciddi kusurlar olup olmadığını bilmenin bir yolu yoktur. BCrypt for .NET uygulamasını buradan edinebilirsiniz . İyi mi yoksa kötü bir uygulama mı olduğunu söyleyecek kadar kriptografi hakkında yeterince bilgim yok. Kriptografi çok derin bir alandır. Kendi şifreleme algoritmanızı oluşturmaya çalışmayın . Ciddi anlamda.

Kendi parola güvenliğinizi uygulayacaksanız (iç çekecekseniz), birkaç şey yapmanız gerekir:

  1. Nispeten güvenli bir karma algoritma kullanın .
  2. Hashing uygulanmadan önce her parolayı tuzlayın.
  3. Her şifre için benzersiz ve uzun bir tuz kullanın ve tuzu şifreyle birlikte saklayın.
  4. Güçlü parolalar gerektir .

Ne yazık ki, tüm bunları yapsanız bile kararlı bir bilgisayar korsanı potansiyel olarak şifreleri çözebilir, bu onun için gerçekten çok uzun zaman alır. Bu senin baş düşmanın: Zaman .

Tek gereken, çünkü bcrypt algoritma çalışır beş karma uzun büyüklükte MD5 daha bir şifre emir ; (ve hala AES veya SHA-512'den çok daha uzun). Hacker'ı parolalarınızı aramak için gökkuşağı tablosu oluşturmak için çok daha fazla zaman harcamaya zorlar ve bu da parolalarınızın saldırıya uğrama riskini çok daha az azaltır.

Şifrelerinizi tuzluyor ve hashing yapıyorsanız ve her bir tuz farklıysa, potansiyel bir bilgisayar korsanı, tuzlu + karma bir şifre için bir gökkuşağı tablosuna sahip olmak için her tuz çeşidi için bir gökkuşağı tablosu oluşturmalıdır . Bu, 1 milyon kullanıcınız varsa, bir bilgisayar korsanının 1 milyon gökkuşağı tablosu oluşturması gerektiği anlamına gelir. Her kullanıcı için aynı tuzu kullanıyorsanız, bilgisayar korsanının sisteminizi başarılı bir şekilde hacklemek için yalnızca 1 gökkuşağı tablosu oluşturması gerekir.

Parolalarınızı tuzlamıyorsanız, bir saldırganın yapması gereken tek şey, oradaki her uygulama (AES, SHA-512, MD5) için mevcut bir Rainbow tablosunu açmak ve hash ile eşleşen birinin olup olmadığına bakmaktır. Bu zaten yapıldı , saldırganın bu Rainbow tablolarını kendisinin hesaplaması gerekmez .

Tüm bunlara rağmen, iyi güvenlik uygulamaları kullanıyor olmalısınız . Sitenizde başka bir saldırı vektörünü (XSS, SQL Enjeksiyonu, CSRF, vb. ) Başarıyla kullanabilirlerse , iyi parola güvenliğinin önemi yoktur. Bu tartışmalı bir ifadeye benziyor, ancak bir düşünün: Tüm kullanıcı bilgilerinizi bir SQL enjeksiyon saldırısı yoluyla alabilirsem veya kullanıcılarınızın bana tanımlama bilgilerini XSS aracılığıyla vermesini sağlayabilirsem , şifreniz ne kadar iyi olursa olsun güvenliktir .

Diğer kaynaklar:

  1. Jeff Atwood: Basitleştirilmiş .NET Şifreleme (hashing'e genel bir bakış için harika)
  2. Jeff Atwood: Senin olarak yeni giriş yaptım
  3. Jeff Atwood: Muhtemelen parolaları yanlış depoluyorsunuz
  4. Jeff Atwood: Hızlı Hashing

Not: Lütfen başka iyi kaynaklar önerin. Düzinelerce yazarın bir düzine makalesini okumuş olmalıyım, ancak çok azı Jeff'in yaptığı kadar açık bir şekilde konu hakkında yazıyor. Lütfen makaleleri buldukça düzenleyin.


belki tuz paragrafınıza bir tuzun rastgele seçilmesi gerektiğini ekleyin
Jacco

2
@Jacco İyi çağrı eklendi. O kadar önemli olmasa da. Sadece tuz için giriş zaman damgasını kullanabilirsiniz. Yaptığı fark, saldırganın her tuz için gökkuşağı tablosunu yeniden hesaplaması gerektiğidir. Bunu zorlaştıran bu, rastgele seçilmiş olması değil. Rastgele yapmak başka bir gözlem eğitimi katmanı ekleyecektir, ancak saldırgan veritabanınızı görebildiğinde bu işe yaramaz (ilk başta tüm gönül yaramıza neden olan sorun budur).
George Stocker

3
Gerçekte değil, tuzun gizli olması gerekmiyor, her durum için sadece benzersiz. Eşsiz (dünya çapında olduğu gibi) mümkün olmadığından, rastgele bir sonraki en iyi şeydir. Ayrıca, yeterli entropi olmadığı için zaman damgası iyi bir tuz değildir.
Jacco

7
"XSS veya SQL enjeksiyonunu başarılı bir şekilde kullanabilirlerse, iyi bir şifre güvenliği önemli değildir" ifadenizle sorun yaşıyorum. Aksine, sitenize başarılı bir şekilde XSS veya SQL enjekte edebilirlerse, iyi şifre güvenliği daha da önemlidir. Buradaki anahtar "derinlemesine savunmadır" - uygulamanızın her katmanında güvenliği mümkün olduğu kadar sıkılaştırmalısınız.
jammycakes

2
@jammycakes Kesinlikle; amacım kayboldu: "Hey, şifrelerimizi karıştırıp tuzluyoruz," iyiyiz "diyemezsiniz!"
George Stocker

74

Sen kullanmamalıdır NET'te Bcrypt. Sen kullanmanız gerekir yerleşik .NET framework uygulaması ile olduğu gibi PBKDF2. NIST tarafından önerilen algoritma olmasının yanı sıra, .NET'te şifrelenmiş olarak doğrulanmış tek uygulama budur .

StackId daha önce BCrypt kullanıyordu ve bu nedenle PBKDF2'ye taşındı:

Merak edenler için, PBKDF2 ile şifreleri karıştırıyoruz. Alakalı kod burada ( http://code.google.com/p/stackid/source/browse/OpenIdProvider/Current.cs#1135 ), birkaç yönlendirme katmanı üzerinden. Daha önceki bir yinelemede, BCrypt kullanıyorduk; ancak .NET çerçevesinde inşa edildiği için PBKDF2'ye geçildi, oysa BCrypt bir uygulamayı doğrulamamızı gerektirecekti (küçük bir girişim yok).

Kevin Montrose, 27 Mayıs 2011

(GitHub'da güncellenmiş bağlantı)

Düzenleme: Kriptografik terimlerle doğrulanmış ifadesinin anlamı hemen anlaşılmamış gibi görünmektedir, doğrulanmış bir uygulama, hatasız olarak uygulanmasının şifreli olarak kanıtlandığı anlamına gelir. Bunun maliyeti kolayca 20.000 $ veya daha yüksek bir değere ulaşabilir. OpenSSL üzerinde araştırma yaparken bunu hatırlıyorum ve tüm doğrulama sürecini tamamlamadıklarını belirttikleri yerleri okudum, ancak tam olarak doğrulanmanız gerekiyorsa, bunun için doğru yolu gösterebileceklerini ve ilgili maliyetleri belirtmiş olduklarını tam olarak doğrulamanız gerekiyorsa. Bazı hükümet gereksinimleri, doğrulanmış şifreleme algoritmaları için yetkileri içerir.

.NET'teki bcrypt uygulamaları doğrulanmadı. Doğrulanmamış bir şifreleme uygulamasını kullanarak, şifrelenmiş olana bir arka kapıya izin vermek gibi kasıtlı kötü niyetli hatalar veya kriptografik olarak güvensiz verilerle sonuçlanan kasıtsız uygulama hataları olmadığından kesinlikle emin olamazsınız.

2014 düzenlemesi: Doğrulanmış kriptografik algoritmaları kullanmanın zorunluluğunu sorgulayan herkes, OpenSSL'de istismar edilen yürek kanayan hack tarafından yaratılan yıkıma bakın . Doğrulanmamış bir uygulama kullanmanın maliyeti budur. Bu güvenlidir .... herhangi bir kişinin sunucunuzun tüm bellek içeriğini okuyabileceğini öğrenene kadar.

Heartbleed'i tanıtan değişikliğin yazarı Robin Seggelmann, "uzunluk içeren bir değişkeni doğrulamayı kaçırdığını" belirtti ve hatalı bir uygulama sunma niyetini reddetti. Heartbleed'in açıklamasının ardından Seggelmann, OpenSSL'nin yeterli sayıda kişi tarafından incelenmediğini belirterek ikinci konuya odaklanmayı önerdi.

Bu, doğrulanmamış bir uygulamanın tanımıdır. En küçük kusur bile tüm güvenliğin sakat kalmasına neden olabilir.

2015 düzenlemesi: Öneriye dayalı dil kaldırıldı ve mutlaklar ile değiştirildi. Gelecek için gömülü orijinal Kevin Montrose yorumu.


25
Bağlantılı yorumu alıntılamak için: "[biz] .NET çerçevesinde yerleşik olduğu için PBKDF2'ye geçtik, oysa BCrypt bir uygulamayı doğrulamamızı gerektirecektir". Yorumun algoritmanın daha iyi olduğunu söylemediğine dikkat edin , sadece SE Dev Team'in yerleşik PBKDF2 uygulamasını harici bir kitaplıktan (ki bu nihayetinde bir yargı çağrısıdır) daha güvenilir olduğunu düşünüyor.
Piskvor,

3
@Piskvor Cevabımı güncelledim. Bu, SO ekibinin neyi güvenli olarak gördüğü ile ilgili değil, doğal olarak kanıtlanmış güvenli veya umarız güvenli arasında bir yargı çağrısı. İkincisi, kriptografi söz konusu olduğunda kabul edilemez.
Chris Marisic

6
SO'nun tüm bcrypt karma şifrelerini yeni karmalara nasıl taşıdığını merak ediyorum. Yeni algoritmayı kullanarak hashing yapmak için ham şifrelere ihtiyaçları yok mu?
Dharmendar Kumar 'DK'

8
@DK Onlardan şifrelerini sıfırlamalarını istemen gerektiğini bile düşünmüyorum. Bir sonraki oturum açışınızda (şifresiz metin şifrelerini sağladıkları yerde) bunu yapabileceğinizi düşünüyorum.
Matt Kocaj

12
Bu kötü bir tavsiye ve bu kadar çok olumlu oy almasına şaşırdım. BCrypt uygulamasının yönetilen bir dilde doğrulanması, C'de bütün bir SSL uygulaması gibi bir şeyi doğrulamaktan çok çok daha önemsizdir. Heartbleed tamamen alakasızdır; karma eşitlik kontrolleri ile PHP tipi zorlama problemlerinden bahsetmeniz daha iyi olur. Artı, pratik anlamda büyük ölçüde uygun olsa da, PBKDF2 bir şifre karma algoritması değil, bir KDF'dir, oysa BCrypt daha uygundur. Ne olursa olsun, bu günlerde Argon2'yi kullanmak çok daha mantıklı olacaktır, bunun için iyi test edilmiş bir C # kitaplığı vardır
Polinom
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.