2010-03-03 9 views
16

Java'da parola tabanlı dosya şifreleme yapıyorum; Altta yatan şifreleme algoritması olarak AES kullanıyorum ve PBKDF2WithHmacSHA1, aşağıdaki kodu kullanarak bir tuz ve parola bileşiminden bir anahtar türetmek için kullanıyorum (bu sitedeki başka bir posterden aldım). Sorunum ben kullanıcının girdiği şifre önce doğru olduğunu doğrulamak mümkün olmak istiyorum olmasıdır :-)Java'da PBKDF2 ile Şifre Doğrulama

SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
KeySpec ks = new PBEKeySpec(password,salt,1024,128); 
SecretKey s = f.generateSecret(ks); 
Key k = new SecretKeySpec(s.getEncoded(),"AES"); 

Tuzu paylaşmak, kullanıcı her iki ucunda ve şifreleme ve şifre çözme çalışma cezası adresinden şifresini girer (potansiyel olarak uzun) şifre çözme sürecine giriş. PBKD özelliklerinin isteğe bağlı 2 bayt doğrulama değeri içerdiğini biliyorum, ancak yukarıdaki değeri kullanarak bu değeri nasıl üreteceğimi bilmiyorum. Java bunun için destek sağlıyor mu, yoksa güvenli bir alternatif ne olurdu?

Zaman ayırdığınız için teşekkür ederiz.

cevap

4

Hey, çılgın scot ve Chris yardım için teşekkürler. Bazı kazma yaptıktan sonra hem şifre doğrulama hem de mesaj doğrulama için Dr Gladmans file encryption page'da açıklanan yöntemleri kullanmaya karar verdim. PBKDF2'ye ve MAC'a dayanan bu yöntemin, parola için doğrulama değerini, güvenli hale getirecek kadar pahalı hale getirdiğine inanıyorum. Tekrar teşekkürler ve umarım bu çözüm başkalarına yardımcı olur.

5

Tanım olarak, güvenli bir "hızlı kontrol" mekanizması yoktur. PBKDF2 veya ilgili tekniklerin kullanılmasının tamamı, şifre kırma programlarının başarısı için şifre kontrolünün yavaşlatılmasıdır. Hızlı bir kontrol sistemi eklediyseniz, şifre kırıcılar parolaları çok hızlı bir şekilde toplu olarak tahmin edebilirler.

+0

Merhaba, cevabınız için teşekkürler. PBKDF2'nin amacının ve tuzun ve parolanın anahtarın türetilmesi için tekrar tekrar birleştirilmesi amacının, anahtar metin paroladan anahtar hesaplama işleminin pahalı hale getirilmesi ve bu nedenle sözlük stili saldırılarının daha zor hale getirilmesi olduğu izlenimindeyim. PBKDF2 spec opsiyonel bir şifre doğrulama değeri içerdiğini söylediğim gibi, sadece java uygulamasında ona nasıl ulaşacağımı bilmiyorum. – PinkyNoBrain

+0

Anahtar türetme sürecinin tamamlanmasından sonra hızlı bir kontrol yapılmasının, saldırganın gerçekte herhangi bir şeyi kontrol etmek için şifresini çözmesi gerekmediği için kaba kuvvet saldırısı kolaylaştıracağını kabul ediyorum, ancak 256-bitlik AES anahtarlarının geniş arama alanını düşünürdüm. Zaten saf kaba kuvvet saldırısı yasaklayıcı mı? – PinkyNoBrain

+0

@pinkynobrain: Hızlı kontrolle ilgili sorun, anahtar alanı çok fazla küçültmesidir: hızlı kontrolün başarılı olduğu tüm parolaları bulmanın hızlı bir yolu vardır. Bu nedenle, AES ile kaba kuvvete çok daha az anahtarınız var. –

2

Bir çeşit parola doğrulama etiketi hesaplayın ve şifrelenmiş dosya verilerinin yanında saklayın, böylece önce bunu kontrol edebilirsiniz. Bu sabit (kısa) bir dizinin PBMAC'si gibi bir şey olabilir. Tabii ki, bunun tersine çevrilemez bir fonksiyon olması gerektiğinden, bir korsan şifre belirleyemedi ve kaba kuvvet saldırısını karıştırmak için çok hızlı hesaplanamadı.

Tüm dosyanın doğru şekilde şifresinin çözülüp çözülmediğini (ve nasıl) algılayacağınızı düşündünüz mü? Muhtemelen AES'i doğrudan kullanmak yerine bazı PBES2 ve PBMAC kombinasyonlarına bakmalısınız.

+0

Merhaba, hızlı cevabınız ve PBES2 ve PMAC hakkındaki tavsiyeleriniz için teşekkürler, kesinlikle buna bakacağım. Sabit dize yaklaşımını kullanmayı düşünmüştüm, ancak bilinen düz metin saldırılarına süreci açmasından endişe ediyordum. Bunun yerine, anahtarın kendisinin güvenli bir karesini kullanmayı düşündüm, eğer karma işlevi gerçekten dönüştürülemezse, bu anahtarın kendisinde hiçbir bilgi vermezdi, ancak yine de anahtarların aynı olduğunu kontrol etmeme izin verirdi. Ne düşünüyorsun, bu iyi bir yaklaşım mı? – PinkyNoBrain

+0

Bu tür bir doğrulama türünün mutlaka bir tür düz metne dönüştüğü doğrudur. Bununla birlikte, PB * işlevlerinin kullanımı, çalışmayı daha zor hale getirir ve tek bir hash ile karşılaştırıldığında, yineleme sayınız tarafından etkin bir şekilde çarpılır. – crazyscot