it-swarm-tr.com

PBKDF2 ile, bayt cinsinden en uygun karma boyutu nedir? Tuzun büyüklüğü ne olacak?

PBKDF2 ile bir karma oluştururken, geliştiricinin karma boyutunu seçmesine izin verir. Daha uzun hep daha mı iyidir? Ayrıca, rastgele tuzun büyüklüğü ne olacak? Bu, karma ile aynı boyutta olmalı mı?

EDIT: Özellikle karma şifrelerde.

27
blesh

Karma işlevi için, en verimli platform türünün (saniyede ve dolar başına daha fazla karma hesaplama üretecek olan) kullanmak istediğiniz makine (yani bir PC) olduğu bir işlev kullanmak istersiniz. Çünkü saldırganla bir silah yarışındasınız ve saldırgan size bir avantaj elde etmek için başka bir donanım satın alabilir (GPU gibi). GPU 32-bit aritmetikte çok iyidir, ancak 64-bit aritmetikte iyi değildir, oysa PC (64-bit modunda) ikincisinde oldukça hızlı olacaktır.

Bu nedenle, 64 bit aritmetik işlemlerde çalışan bir karma işlevi kullanın. Bu SHA-512'yi gösterir.

PBKDF2 bir anahtar türetme işlevi : yapılandırılabilir boyutta bir çıktı üretir. Parola karma için, boyutun genel preimage saldırılarını caydırmak için yeterince büyük olmasını istersiniz (yani, bir eşleşme bulunana kadar rastgele parolalar denemek), bu nedenle, örneğin en az 80 bit çıktı gerekir. Güvenliği sadece dikkatsiz ve estetik için daha ikna edici yapmak için, bir sonraki 2 güç için gidin: a 128 bit çıkış . Bunun ötesine geçmek yararlı değildir.

Tuz benzersiz - olabildiğince benzersiz olmalıdır. Benzersiz tuz değerleri elde etmenin kolay bir yolu, kriptografik olarak güçlü PRNG : Tuz değerini tekrar kullanma olasılığı, bu rastgele tuzlar yeterince büyükse ve "yeterince büyükse" ihmal edilecek kadar düşük olacaktır. "" 128 bit "anlamına gelir. Öyleyse rastgele 128 bit tuzlar kullanın.

Şahsen ben bcrypt tercih şifre karma için PBKDF2 yerine.

24
Thomas Pornin

PBKDF2 standardına göre, tuz için önerilen minimum boyut 64 bittir, ancak iyi bir güvenlik marjı için kişisel olarak 128 bit veya daha fazla tavsiye ederim. Tuzun boyutu, hash seçiminizden bağımsızdır.

Güvenlik söz konusu olduğunda, en az 256 bit olmak üzere, tuzunuzun çıktısının en az aynı boyutta türetilmiş bir anahtar uzunluğu seçmenizi öneririm. 256 bit'ten küçük herhangi bir karma boyutu, zaten en modern karma işlevlerinin güvenlik sınırının altındadır.

Bu boyuttaki bir anahtarı işleyemeyen bir blok şifreleme anahtarı kullanmadığınız sürece, karma işlevinin çıkış uzunluğundan daha az türetilmiş bir anahtar uzunluğu seçmek çok mantıklı değildir.

Optimum güvenlik açısından, SHA-512'yi PRF olarak, 512 bit türetilmiş bir anahtar, 128 bit tuz ve durumunuzun garanti edebileceği kadar yineleme ile öneririm.

11
Polynomial

Seçim platformunuz .NET ise, özellikle Rfc2898DeriveBytes sınıfına ayrılmış bir OWASP makalesi vardır. Özellikle not (benimkini vurgulayın):

Rfc2898DeriveBytes'in yerleşik .NET uygulaması kullanıcıyı bir psudorandom işleviyle sınırlar - SHA-1 ile HMAC. Bu, bugün birçok senaryoda kabul edilebilir, ancak gelecekte daha karmaşık bir karma işlevi gerekebilir.

Şifre saklamak için PBKDF2 kullanıldığında, taban hash fonksiyonunun boyutundan asla daha fazla bit çıkmamalıdır. PBKDF2-SHA1 ile bu 160 bit veya 20 bayttır . Daha fazla bit çıkışı, karmayı daha güvenli hale getirmez, ancak saldırgana mal olmayacak şekilde savunmacıya çok daha fazla zaman harcar. Bir saldırgan, PBKDF2 çıkışının sıfırlanması için zaman kazandırarak, ilk karma işlev boyutlu çıkışı karşılaştırır.

Ayrıca diğer cevapların rehberlik göre ayarlanmış bir kod örneği var:

public static string Hash(string str)
{
    // Generate the hash, with an automatic 16 byte salt
    using (var rfc2898DeriveBytes = new Rfc2898DeriveBytes(str, 16))
    {
        rfc2898DeriveBytes .IterationCount = 10000 // or whatever you can afford
        byte[] hash = rfc2898DeriveBytes.GetBytes(20);
        byte[] salt = rfc2898DeriveBytes.Salt;
        return Convert.ToBase64String(salt) + "|" + Convert.ToBase64String(hash);
    }
}
4
Ohad Schneider