Tuz karma değerleri nereden gelmelidir?


12

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.


@DevArt, burada çok daha uygun olduğunu düşündüm çünkü çok öznel bir cevap gerektiriyor. Bir tuz değeri her yerden çekilebilir, bu yüzden "Tuz değerlerini almak için en güvenli yerin nerede olduğunu düşünüyorsunuz: istemci veya sunucu?"
Morgan Herlocker

Yanıtlar:


7

Genelde created TIMESTAMPkullanı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)

Daha sonra kullanıcı tekrar oturum açtığında, doğrulama için yeniden oluşturduğunuzda tarihi kullanıcı adına göre çektiğinizi varsayıyorum?
Morgan Herlocker

1
@Prof: Evet, tuz için belirli bir sütununuz varsa yaptığınız gibi, bu perspektifte fark yok.
Jonas

7

Ö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.


1
Genelde ikinci sorunu gördüm - farklı görünen özdeş parolalar - kullanıcı adı, tuz ve parolayı birleştirerek ve tüm dizeyi karma yaparak ele aldım. Bu, hesap başına benzersiz bir tuz üretme ihtiyacını ortadan kaldırır.
Justin Cave

1
@Justin: ilginç, kullanıcı adının karmanın bir parçası olarak kullanıldığını hiç görmemiştim, ama gerçekten entropi eklemenin iyi bir yolu. Yine de sahte bir tuz kullanırım, çünkü sadece bir tane üretmek için çok pahalıya mal olmaz.
Matthieu M.

2
@ Matthieu Bir yerde saklamak zorunda olmanın dezavantajı ve bir işlemin her iki tarafının da ihtiyacı varsa, onu da göndermek zorunda. Kullanıcı adıyla, her iki taraf bunu zaten biliyor.
Matthew Frederick

2
@ Justin: Bu durumda kullanıcı adını tuz olarak kullanıyorsunuz. Tuzun her iki amacına da cevap verir: gökkuşağı tablolarını pratik hale getirmek ve benzer şifreleri farklı göstermek.
David Thornley

@David - Doğru, kullanıcı adı tuzun bir parçası haline bakabilirsiniz. Saldırganın kullanıcı adı / şifre kombinasyonlarını bulmak için gökkuşağı tablosu kullanamaması için yine de ek bir tuz istiyorum. Açık bir tuz olmadan, saldırganın gökkuşağı tablosundan ihtiyaç duyduğu dizenin boyutunu kullanıcı adının uzunluğuna göre arttırırsınız (bu kısa ve tamamen küçük veya tamamen büyük olabilir). Siteniz bir saldırganın siteye özgü bir gökkuşağı tablosu oluşturacak kadar büyük olmadıkça, bir gökkuşağı tablosu saldırısını engellemek için sabit bir tuz yeterlidir.
Justin Cave

3

Yeni bir şifre (kayıt, şifre sıfırlama, şifre güncelleme) her saklamak istediğinizde, iyi bir teknik:

  • yeni tuz üret
    • kriptografik olarak güvenli sahte rasgele sayı üreteci kullanma
    • iyi boyutta bir tuz kullanın - iyi bir değer, altta yatan karma algoritmanın blok boyutudur (SHA-256 olabilir)
  • yeni bir şifre belirteci oluştur
    • tuz hmac anahtarı olarak kullanılarak altta yatan karma algoritmadan (SHA-256 olabilir) bir hmac işlevi oluşturun
    • for i in (0...65536) { password = hmac(password) }
    • hmac fonksiyonunun yinelenen uygulamalarının sonucu şifre belirtecidir
  • tuz ve şifre kodunu saklayın
    • orijinal şifreyi saklama
    • isteğe bağlı olarak temel karma algoritmasını ve keşfedilebilirlik için genişlemeleri depolayın

1

Ç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 Randomyukarı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 !@#$%.


1

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


Ne olsa göre atayın? Kullanıcı, oluşturma işleminden sonra yeniden oturum açtığında çoğaltılabilmesi için yerinde kalacak bir değerden gelmesi gerekmez mi?
Morgan Herlocker

"Ata" ile kullanıcı adı / şifre çifti (hesap) başına bir tuz üretmek ve veritabanında saklamak istiyorum. Giriş yapmanız gerektiğinde, depolanan tuzu bir şeyleri kontrol etmek için kullanırsınız.

1

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.

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.