Parola gibi bir şeye düz metinde saklanamayan bir karma değerine tuz değerleri eklerken, tuz değerlerinin gelmesi için en iyi yer hangisidir? Bağlam için bunun bir web sayfası girişindeki şifreler için olduğunu varsayalım.
Parola gibi bir şeye düz metinde saklanamayan bir karma değerine tuz değerleri eklerken, tuz değerlerinin gelmesi için en iyi yer hangisidir? Bağlam için bunun bir web sayfası girişindeki şifreler için olduğunu varsayalım.
Yanıtlar:
Genelde created TIMESTAMP
kullanıcı tablosunda bir sütun var , böylece kullanıcının ne zaman kayıt yaptığını görebiliyorum. Tuz için ek bir sütun eklemek istemiyorum, bu yüzden zaman damgası sütununu tuz olarak kullanıyorum:
SHA1(password + created)
Önemli mi?
Tuz iki amaca hizmet eder. Büyük önceden hazırlanmış şifrelerin ("gökkuşağı tabloları") kullanılmasını pratik hale getirir ve aynı şifrelerin karma listesinde farklı görünmesini sağlar. Aynı parolaların farklı görünmesi, birkaç kişinin belirli bir parolayı kullandığı bir sorundan kaçınmaya yardımcı olur, ki bu muhtemelen yaygın bir zayıf paroladır.
Bu nedenle, her bir hesabın kendine özgü bir tuzu olmalı ve tuzlar, ortaya çıkması muhtemel bir grup tuz olmayacak şekilde, aşırı tahmin edilebilir olmamalıdır. (Birçok site 1'de başlayıp sayılırsa, kötü adamlar, örneğin düşük sayıdaki tuzlar da dahil olmak üzere gökkuşağı tabloları oluşturabilirler.) Genellikle öngörülemeyenlerden başka herhangi bir anlamda rastgele olmaları gerekmez. Karmaların kendisinden daha gizli değiller, bu yüzden özellikle öngörülemez olmaları gerekmiyor.
Bir tuz üretmek için herhangi bir uygun yöntemi kullanın. Hesap sayısına kıyasla çok sayıda potansiyel tuz değeri (erken Unix sistemleri sık sık iki bayt, olası 65536 sayısı için kullanılır) varsa, yarı rastgele atama neredeyse hiçbir zaman yinelenen bir tuz vermez.
Yeni bir şifre (kayıt, şifre sıfırlama, şifre güncelleme) her saklamak istediğinizde, iyi bir teknik:
for i in (0...65536) { password = hmac(password) }
Çerçeveden yararlanın. .NET'te RNGCryptoServoiceProvider kullanabilirsiniz ...
// If salt is not specified, generate it on the fly.
if (saltBytes == null)
{
// Define min and max salt sizes.
int minSaltSize = 4;
int maxSaltSize = 8;
// Generate a random number for the size of the salt.
Random random = new Random();
int saltSize = random.Next(minSaltSize, maxSaltSize);
// Allocate a byte array, which will hold the salt.
saltBytes = new byte[saltSize];
// Initialize a random number generator.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
// Fill the salt with cryptographically strong byte values.
rng.GetNonZeroBytes(saltBytes);
}
Diğer çerçeveler, kaldırabileceğiniz benzer sınıflara sahip olmalıdır. Rastgele yazılım elde etmek için genellikle Random
yukarıda belirtilenlere göre kullanıcı kullanır . Tuz sağlamak için fareyi tanımlı bir alanda rastgele hareket ettirmek TrueCrypt tarafından kullanılan bir seçenektir. Özel gereksinimlerinize ve güvenlik seviyenize bağlıdır; çünkü tuzunuz basitçe olabilir !@#$%
.
Tuz sunucu tarafı oluşturur ve oluşturulduktan sonra kullanıcı hesabına atarsınız. Çerçevenizle birlikte sunulan bazı kripto oluşturma API'larını daha iyi kullanın, ancak prensipte herhangi bir sekans yapar.
Genellikle işler şu şekilde saklanır:
User
-------------------
ID
Username
PasswordHashWithSalt
Misal:
PasswordHashWithSalt =
A15CD9652D4F4A3FB61A2A422AEAFDF0DEA4E703 j5d58k4b56s8744q
Bcrypt kullanın ve bu makaleyi okuyun sadece normal hashes için bu gün ve yaşta ciddi koruma değildir.
Çok sayıda açık kaynak kütüphanesi olan ve patentsiz SDR sıfır bilgi şifre protokolü kullanmayı düşünün .
SDR tuz gerektirir ve almak için en iyi yer müşteri; tuş vuruşlarını, fare hareketlerini, hash ortam değişkenlerini, rasgele sayıları, geçici klasörlerinde dosya oluşturma zamanlarını, sunucunuzdan tahmin edilemeyecek bir şekilde tuz yapmak için zaman. SDR, büyük bir asal tuz olan kullanıcı parolasını alır ve bir doğrulama anahtarı oluşturur. Makinelerinden asla ayrılmadığı bir şifreyi saklamıyorsunuz, ancak doğrulama anahtarı ve tuz ile birlikte gelen şifreye sahip olduklarını doğrulayabilirsiniz. Ortadaki insandan ve sözlük saldırılarından bağışıklık kazanır. Emin olmak için veritabanı sütunundaki anahtarları ve tuzu şifreleyin.