Bir esrar için tuzu saklamanın gerekliliği


99

İş yerinde tuzlar için birbiriyle yarışan iki teorimiz var. Üzerinde çalıştığım ürünler, hash'ı tuzağa düşürmek için kullanıcı adı veya telefon numarası gibi bir şey kullanıyor. Esasen her kullanıcı için farklı olan, ancak bizim için hazır olan bir şey. Diğer ürün rastgele olarak her kullanıcı için bir tuz oluşturur ve kullanıcı parolayı her değiştirdiğinde değişir. Tuz, daha sonra veritabanında şifrelenir.

Sorum şu ki, ikinci yaklaşım gerçekten gerekli mi? Tamamen teorik bir perspektiften, ilk yaklaşımdan daha güvenli olduğunu anlayabiliyorum, ama pratiklik açısından ne olacak? Şu anda bir kullanıcının kimliğini doğrulamak için tuzun şifrelenmemiş olması ve oturum açma bilgilerine uygulanması gerekir.

Bunu düşündükten sonra, bu yaklaşımdan gerçek bir güvenlik kazancı görmüyorum. Tuzun hesaptan hesaba değiştirilmesi, saldırgan her bir hesap için ne olduğunu hızlı bir şekilde nasıl belirleyeceğinin farkında olsa bile, birisinin karma algoritmayı kaba kuvvetle denemesini hala son derece zor hale getiriyor. Bu, şifrelerin yeterince güçlü olduğu varsayımına devam ediyor. (Açıkçası, tümünün iki basamaklı olduğu bir dizi parola için doğru karmayı bulmak, 8 basamaklı parolaların doğru karmasını bulmaktan önemli ölçüde daha kolaydır). Mantığımda yanlış mıyım yoksa kaçırdığım bir şey mi var?

DÜZENLEME: Tamam, işte tuzu şifrelemenin gerçekten tartışmalı olduğunu düşünmemin nedeni. (Doğru yolda olup olmadığımı bilmeme izin ver).

Aşağıdaki açıklama için, şifrelerin her zaman 8 karakter olduğunu ve tuzun 5 olduğunu ve tüm şifrelerin küçük harflerden oluştuğunu varsayacağız (bu sadece matematiği kolaylaştırır).

Her giriş için farklı bir tuza sahip olmak, aynı gökkuşağı masasını kullanamayacağım anlamına gelir (aslında yeterli büyüklükte bir tane olsaydı teknik olarak yapabilirdim, ama şimdilik bunu görmezden gelelim). Bu, anladığım kadarıyla tuzun gerçek anahtarıdır, çünkü her hesabı kırmak için tekerleği yeniden icat etmem gerekiyor, böylece her biri için konuşmak. Şimdi, eğer hash'i oluşturmak için bir şifreye doğru tuzu nasıl uygulayacağımı bilirsem, bunu yapardım çünkü bir salt, karma ifadenin uzunluğunu / karmaşıklığını gerçekten artırır. Bu yüzden, tuzun ne olduğunu bildiğim için şifre + tuza sahip olduğumu "bilmek" için üretmem gereken olası kombinasyonların sayısını 13 ^ 26'dan 8 ^ 26'ya düşürüyorum. Şimdi bu işi kolaylaştırıyor, ama yine de gerçekten zor.

Yani tuzu şifrelemek üzerine. Tuzun şifreli olduğunu bilirsem, önce şifresini çözmeyi denemem (yeterli düzeyde şifrelemeye sahip olduğunu varsayarak). Ben görmezden gelirim. Nasıl şifresini çözeceğimi bulmaya çalışmak yerine, önceki örneğe geri dönersek, 13 ^ 26 için tüm anahtarları içeren daha büyük bir gökkuşağı tablosu oluştururdum. Tuzun beni kesinlikle yavaşlatacağını bilmemek, ancak bunun, önce tuz şifrelemesini kırmaya çalışmanın muazzam bir görevini ekleyeceğini düşünmüyorum. Bu yüzden buna değeceğini düşünmüyorum. Düşünceler?

Bir kaba kuvvet saldırısı altında parolaların ne kadar süre dayanacağını açıklayan bir bağlantı: http://www.lockdown.co.uk/?pg=combi


Güzel soru Kevin, tam zamanında. Güvenlik hakkında yorum yapamam, ancak tüm bu şifreleme ve şifre çözme için kesinlikle bir performans düşüşü var.
DOK

Uygun boyuttaki gökkuşağı tablosunu görmezden gelmenize gerek yok - bu tablo aynı zamanda şifrelenmiş tuz tartışmasını da yapar çünkü tuzlanmış karmanın şifresini çözebilir ve orijinal karmanın şifresini çözmek için tekrar kullanılabilir. İyi haber şu ki, masanın oluşturulması muhtemelen yüzyıllar alacaktı.
44'te tloach

Beni anlayan şey, bu büyüklükte bir gökkuşağı masasının yaratılmasının bu kadar uzun süreceğinden tam olarak emin olmadığımdır. O tuhaf bir fikir, onu oluşturmak için Kraken gibi dağıtılmış bir hesaplama platformunu kullanın (gerçekten de öyle). O zaman ne kadar sürer?
kemiller2002

3
@Kevin: SHA1, 40 karakterlik bir onaltılık dize döndürür, dolayısıyla 40 ^ 16 olası dönüş değeri vardır. Tek bir bilgisayarın saniyede 1000 karma hesaplayabildiğini varsayarsak, 1 000 000 bilgisayarın bu büyüklükte bir dizi belirleyebilen bir gökkuşağı tablosu oluşturmasının yaklaşık 10 milyar yıl alacağını hesaplıyorum.
09:44

+1 iyi soru ve iyi okuyorsunuz. Sanırım bu soruya yanlış cevap verdin. Her zaman bir sır olmalıdır çünkü hash elde edilene kadar kırılamaz. CWE-760 ( cwe.mitre.org/data/definitions/760.html ) hakkında bilgi almalısınız
kale

Yanıtlar:


45

Buradaki cevap, kendinize gerçekten neyden korumaya çalıştığınızı sormaktır. Birinin veritabanınıza erişimi varsa, o zaman şifrelenmiş tuzlara erişebilir ve muhtemelen kodunuza da erişebilir. Tüm bunlarla şifrelenmiş tuzların şifresini çözebilirler mi? Öyleyse, şifreleme zaten neredeyse hiç işe yaramaz. Tuz, gerçekten bunu yapmak için oradadır, bu nedenle, şifre veri tabanınızın tamamını tek seferde kırmak için bir gökkuşağı tablosu oluşturmak mümkün değildir. Bu bakış açısına göre, her bir tuz benzersiz olduğu sürece, herhangi bir fark olmadığı sürece, tuzlarınız veya şifrelenmiş tuzlarınız için ayrı ayrı bir kaba kuvvet saldırısı gerekecektir.


Bu kavramlar için biraz yeni. Yani, saf bir soru gibi görünebilir, ancak her olası şifre için salt değeri için yalnızca bir kombinasyon deneyeceğinizden, her şifre için tuzu bilerek gökkuşağı tablosunu oluşturmak daha kolay olmaz mıydı?
stdout

Örneğin 1000 yaygın kullanılan şifreden gelen ranbow tablosu, bunu hashing ile neredeyse aynı hızda kıracaktır. Bunun işe yaramasının tek yolu, parolalarınızın dağıtımının tek tip olduğunu varsaymanız ve bunların olmadığını biliyoruz
DaWNFoRCe

100

Bir tuzu saklamak gereksizdir.

Her hash için farklı bir tuz kullanılmalıdır. Pratikte, kriptografik kalitede rasgele sayı üretecinden 8 veya daha fazla bayt alarak bunu başarmak kolaydır.

Bir itibaren madenin önceki cevabı :

Tuz, önceden hesaplanmış sözlük saldırılarını engellemeye yardımcı olur.

Bir saldırganın olası şifrelerin bir listesine sahip olduğunu varsayalım. Her birine hash uygulayabilir ve kurbanının şifresinin hashiyle karşılaştırabilir ve eşleşip eşleşmediğini görebilir. Liste büyükse, bu uzun zaman alabilir. Bir sonraki hedefinde bu kadar zaman harcamak istemiyor, bu yüzden sonucu, hash'in karşılık gelen girdiyi işaret ettiği bir "sözlüğe" kaydediyor. Parola listesi çok çok uzunsa, biraz yer kazanmak için Rainbow Table gibi teknikleri kullanabilir.

Ancak, bir sonraki hedefinin şifrelerini ele geçirdiğini varsayalım. Saldırgan tuzun ne olduğunu bilse bile, önceden hesaplanmış tablosu değersizdir - tuz, her şifreden kaynaklanan karmayı değiştirir. Hedefin tuzunu girişe ekleyerek listesindeki tüm şifreleri yeniden hash etmesi gerekir. Her farklı tuz farklı bir sözlük gerektirir ve yeterince tuz kullanılırsa, saldırganın tümü için sözlükleri depolayacak yeri olmayacaktır. Zaman kazanmak için alan ticareti artık bir seçenek değil; saldırgan, saldırmak istediği her hedef için listesindeki her bir şifreyi karma haline getirmeye geri dönmelidir.

Bu yüzden tuzu gizli tutmaya gerek yok. Saldırganın söz konusu tuza karşılık gelen önceden hesaplanmış bir sözlüğe sahip olmadığından emin olmak yeterlidir.


Bunu biraz daha düşündükten sonra, tuzun gizlenebileceğini düşünerek kendinizi kandırmanın tehlikeli olduğunu fark ettim. Tuzun gizlenemeyeceğini varsaymak ve buna rağmen sistemi güvenli olacak şekilde tasarlamak çok daha iyidir. Başka bir cevapta daha ayrıntılı bir açıklama sunuyorum .


Bununla birlikte, NIST'in son tavsiyeleri ek, gizli bir "tuz" kullanımını teşvik ediyor (başkalarının bu ek gizli "biber" dediklerini gördüm). Anahtar türetmenin ek bir yinelemesi, bu sırrın bir tuz olarak kullanılmasıyla gerçekleştirilebilir. Önceden hesaplanmış bir arama saldırısına karşı gücü artırmak yerine, bu tur, iyi bir anahtar türetme işlevindeki çok sayıda yineleme gibi, parola tahminine karşı koruma sağlar. Bu sır, karma şifre ile saklanırsa hiçbir amaca hizmet etmez; gizli olarak yönetilmelidir ve bu, büyük bir kullanıcı veritabanında zor olabilir.


1
Tuzun gizlenmesi gereklidir çünkü esrar elde edilene kadar kırılamaz. Bu CWE-760 ile ilgilidir ( cwe.mitre.org/data/definitions/760.html )
kale

28
@ The Rook - Hayır, bu sorunu yanlış yorumluyorsunuz. Tahmin edilebilir tuzların kullanımına atıfta bulunur. Tuzu gizli tutmakla ilgili hiçbir şey söylemiyor. Aslında, başka bir sır kullanmadan tuzun sırrını gerçekten saklayamazsınız ... bu durumda, neden ikinci sırrı tuz olarak kullanmayasınız? Kullanıcı adını tuz olarak kullanmak kötüdür çünkü birden fazla sistemin aynı kullanıcı adını paylaşması muhtemeldir ve bu belirli tuz için bir tablo oluşturmayı daha değerli hale getirir. Rastgele tuzlar iyi, ancak yok gizli tutulması gerekir.
erickson


1
@erickson, sanırım burada terminolojiyi karıştırıyorsunuz. Tuzlar, gizli olmadıkları sürece sözlük saldırılarını engellemez. Pek çok tuz açık bir şekilde depolanır. Ve eğer tuzu biliyorsanız, sözlük saldırısı sadece tuzu sözlük teriminize eklemek için gereken süre kadar yavaşlar :) Tuzlar, Rainbow tablo aramalarını engeller .... ki bu oldukça hızlıdır. Saldırgan sizin tuzunuzu bilirse, bir sözlük saldırısından korunmazsınız. Saldırgan sizin tuzunuzu bilmiyorsa, bir sözlük saldırısından korunursunuz ve bir kaba kuvvet saldırısı kullanmaları gerekir.
Ultratrunks

4
@Ultratrunks Evet, "önceden hesaplanmış sözlük saldırıları" terimini kullanarak bu konudaki bazı yanıtlarıma açıklık getirdim. Rainbow tablolarından daha genel olarak, bir anahtar olarak karmasını kullanarak bir düz metnin ters aramasına izin veren herhangi bir yapıyı ifade eder. Seçtiğiniz terimler ne olursa olsun, tuzun Rainbow tablolarını ve benzer mekanizmaları yenmeyi amaçladığını açık bir şekilde açıklıyorum. Her zaman saldırganın tuzu bildiğini varsaymalısınız. Bunu gizli tutmak mümkün olsaydı, şifreyi karıştırmanız gerekmezdi.
erickson

3

"Tuz" ile ilgili anlayışım, kırmayı daha zor hale getirdiği, ancak fazladan verileri gizlemeye çalışmadığıdır. Tuzu "gizli" yaparak daha fazla güvenlik elde etmeye çalışıyorsanız, şifreleme anahtarlarınızda gerçekten daha fazla bit olmasını istersiniz.


3

İkinci yaklaşım sadece biraz daha güvenlidir. Tuzlar, kullanıcıları sözlük saldırılarından ve gökkuşağı tablosu saldırılarından korur. Hırslı bir saldırganın tüm sisteminizi tehlikeye atmasını zorlaştırırlar, ancak yine de sisteminizin bir kullanıcısına odaklanan saldırılara karşı savunmasızdırlar. Telefon numarası gibi herkese açık olan bilgileri kullanırsanız ve saldırgan bunun farkına varırsa , saldırıda onlara bir adım kazandırmış olursunuz. Elbette, saldırgan veritabanınızın tamamını, tuzlarını ve hepsini alırsa soru tartışmalıdır.

DÜZENLEME: Bu cevabı ve yorumların bir kısmını tekrar okuduktan sonra, aklıma bazı karışıklıklar sadece soruda sunulan çok özel iki durumu karşılaştırmamdan kaynaklanıyor olabilir: rastgele tuz vs. rastgele olmayan tuz. Saldırganın veritabanınızın tamamını ele geçirmesi durumunda, bir telefon numarasını tuz olarak kullanma sorunu tartışmalıdır, tuz kullanma meselesi değil .


Sözlük saldırılarına karşı nasıl korunurlar?
tloach

Saldırganı her şifre + tuz kombinasyonu için yeni bir sözlük oluşturmaya zorlayarak. Tuz olmadan, bir sözlük tüm şifre tablonuza karşı kullanılabilir.
Bill the Lizard

"Elbette, saldırgan tüm veritabanınızı, tuzları ve hepsini alırsa soru tartışmalıdır." Tuzun şifrelenmesinin nedeni bu değil mi?
Patrick McElhaney

1
@Bill: Az önce bir gökkuşağı tablosu tanımladınız. Sözlük saldırısı, normal kelimeleri aldığım ve onlarla doğrulamaya çalıştığım yerdir. Büyük ölçüde azaltılmış yanıt alanına sahip bir kaba kuvvettir. Hiçbir hash kaba kuvvete karşı savunma yapmaz.
tloach

Bu uygulamayı hiç duymadım ama bir güvenlik uzmanı değilim. Benzersiz tuzları şifrelemek, gökkuşağı tablosu saldırılarına karşı ekstra bir koruma katmanı ekleyecektir.
Bill the Lizard

3

... kullanıcı adı veya telefon numarası gibi bir şey, hash'i tuzağa düşürmek için. ...

Sorum şu, ikinci yaklaşım gerçekten gerekli mi? İlk yaklaşımdan daha güvenli olduğunu tamamen teorik bir perspektiften anlayabiliyorum, ama pratiklik açısından ne olacak?

Pratik açıdan bakıldığında, tuz bir uygulama detayıdır. Kullanıcı bilgilerinin toplanma veya korunma şeklini değiştirirseniz - ve hem kullanıcı adları hem de telefon numaraları bazen tam örneklerinizi kullanmak için değişirse - o zaman güvenliğinizi tehlikeye atmış olabilirsiniz. Bu kadar dışa dönük bir değişikliğin çok daha derin güvenlik endişelerine sahip olmasını ister misiniz?

Her hesabın bir telefon numarasına sahip olması zorunluluğunu ortadan kaldırmak, bu hesapları bir güvenlik ihlaline açmadığınızdan emin olmak için tam bir güvenlik incelemesi gerektiriyor mu?


2
Bazı rasgele kullanıcı bilgilerini kullanıp kullanmadığınızdan bahsetmiyorum bile, bu bilgileri değiştirdiklerinde parolalarını tekrar girmeleri gerekir, böylece yeni tuzla yeniden şifreleyebilirsiniz.
Treborbob

3

Gizli bir tuz artık tuz değildir. Karabiber. Kullanımı vardır. Tuzdan farklı.

Pepper, parola + tuza eklenen gizli bir anahtardır ve hash'i bir HMAC (Hash Tabanlı Mesaj Kimlik Doğrulama Kodu) haline getirir. Karma çıktısına ve tuza erişimi olan bir bilgisayar korsanı, teorik olarak, karma oluşturacak bir girişi tahmin edebilir (ve bu nedenle parola metin kutusunda doğrulamayı geçebilir). Biber ekleyerek problem alanını kriptografik olarak rastgele bir şekilde arttırırsınız ve ciddi bir donanım olmadan problemi çözülemez hale getirirsiniz.

Biber hakkında daha fazla bilgi için burayı kontrol edin .

Ayrıca bkz . Hmac .


2

İşte her bir hash için aynı tuza sahip olmanın neden kötü olduğunu gösteren basit bir örnek.

Aşağıdaki tabloyu düşünün

UserId  UserName,   Password
     1  Fred       Hash1 =  Sha(Salt1+Password1)    
     2  Ted        Hash2 =  Sha(Salt2+Password2)    

Tuz 1, salt2 ile aynı olduğunda durum 1 Eğer Hash2, Hash1 ile değiştirilirse, o zaman 2. kullanıcı, 1. kullanıcı şifresiyle oturum açabilir

Tuz 1 aynı tuz2 olmadığında durum 2 Eğer Hash2 Hash1 ile değiştirilirse, o zaman kullanıcı2 kullanıcı 1 şifresiyle oturum açamaz.


Her hesap için aynı hash'i kullanmıyoruz, her hash için aynı tür bilgileri kullanıyoruz. Örneğin, bir hesabın tuzu, hesabın telefon numarası vb.
kemiller2002

Bunun uzun zaman sonra olduğunu biliyorum, ama ... bu tür saldırılara karşı korunmak için tuzlara güvenemezsiniz. Bir saldırganın kimlik doğrulama sistemi hakkında sır (yani şifre) dışında her şeyi bildiğini varsaymalıyız. Bu nedenle, saldırganın a) tuz olarak neyi kullandığımızı (çoğu zaman bu aynı veri tabanında ve düz metin olarak tabloda saklanır) ve b) tuzla nasıl hashing yaptığımızı (yani ekleyerek, iki kez hashing uyguladığımızı, vb). Kullanıcı hashleri ​​değiştirme yeteneğine sahipse, tuzu da değiştirebileceklerini varsaymalıyız. Tuzlar burada yardımcı olmayacak.
Dave Satch

1

Farklı hedefleri olan iki teknik vardır:

  • "Tuz", aksi takdirde eşit olan iki parolanın farklı şekilde şifrelenmesini sağlamak için kullanılır. Bu şekilde, bir saldırgan şifrelenmiş şifrelerin tüm listesine karşı bir sözlük saldırısını verimli bir şekilde kullanamaz.

  • (Paylaşılan) "gizli", bir mesaja hashing uygulanmadan önce eklenir, böylece bir davetsiz misafir kendi mesajlarını oluşturamaz ve kabul ettiremez.


0

Tuzu saklama eğilimindeyim. Hashing yapmadan önce parolanın başına 1'den 1024'e kadar rastgele bir sayı ekleyerek 10 bitlik tuz kullanıyorum. Kullanıcının girdiği şifreyi hash ile karşılaştırırken, 1'den 1024'e kadar döngü yapıyorum ve eşleşmeyi bulana kadar mümkün olan her tuz değerini deniyorum. Bu, saniyenin 1 / 10'undan daha az sürer. Bunu PHP password_hash ve password_verify'dan bu şekilde yapma fikrini aldım . Örneğimde, "maliyet" 10 bit tuz için 10'dur. Veya başka bir kullanıcının söylediği gibi, gizli "tuz" a "biber" denir. Tuz, veritabanında şifrelenmez. Brute zorlandı. Bu, gökkuşağı tablosunu hash'i 1000 kat daha büyük hale getirmeyi gerekli kılar. Sha256'yı hızlı olduğu için kullanıyorum, ancak yine de güvenli kabul ediliyor.


Yani şifrem "345678" ise ve başına eklediğiniz rastgele tuz "12" ise. Birisi parolam olarak "45678" girerse. Bu birçok yönden yanlış görünüyor.
Yurippenet

-1

Gerçekte, verilerinizi ne tür bir saldırıdan korumaya çalıştığınıza bağlıdır.

Her parola için benzersiz bir tuzun amacı, tüm parola veritabanına yönelik bir sözlük saldırısını önlemektir.

Her bir parola için benzersiz tuzu şifrelemek, tek bir parolayı kırmayı daha zor hale getirir, evet, ancak gerçekten bir faydası olup olmadığını tartmalısınız. Saldırgan kaba kuvvet kullanarak şu dizeyi bulursa:

Marianne2ae85fb5d

DB'de depolanan bir hash için karmalar, hangi bölümün geçiş ve hangi bölümün tuz olduğunu anlamak gerçekten bu kadar zor mu?


2
Eğer kaba biri şifreyi tahmin etmesi imkansız bir şeyi zorlarsa, yine de söyleyeyim, çünkü görünüşe göre kimsenin aklına bile gelmemiş bir teknolojiye sahipler.
Instance Hunter
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.