zFix
Bir Kömür Göründü Kaptanım!
- Katılım
- 17 Haziran 2021
- Mesajlar
- 119
- Elmaslar
- 4
- Puan
- 1.320
- Minecraft
- zFix
Discord:
zFix#0001
zFix#0001
zFix#0001
çünkü kullandığım yazılım dilinde bu tür bir salt yapamıyorumNeden saltlamasını istemiyorsunuz?
zFix#0001
burada salt ı oluşturmak sıkıntı hata aynı şifre ile aynı hesap adına 2 hesap açıyorum 2 sininde hashi farklı oluyorAuthme Sha256 şifrelemesi yaparken bunu kullanıyor:
Ekli dosyayı görüntüle 188500
Kendi sisteminizi buna uygun yaparsanız authme ile uyunlu yapabilirsiniz.
zFix#0001
işte o yüzden böyle bir sistem arıyorumSalt her zaman farklı olur zaten.
Salt her kayıt yapıldığında yeniden oluşturuluyor.
Genelde 16 harf rastgele string olarak.
// Varsayalım ki
// generateSalt(): Rastgele 10 karakter üretsin.
// hash(value): "value" parametresini SHA256 ile hashleyip hex çıktısını versin.
// db_get(name): "name" parametresiyle eşleşen veriyi veritabanından çekip sonucunu versin.
// db_set(name, value): "name" parametresinin değerini "value" parametresindeki değere ayarlayıp veritabanına kaydetsin.
hash("merhaba") // Sonuç: 4c6bcdd55f3153e1939669ab1ec039e4059174dc25abdfcb2f58868849b4d61b
hash("mrhaba") // Sonuç: 0bcf9828fdbdd3d196228764b5176d5f2129182b91899a8d25c6e8965b21fc03
hash("merhaba") // Sonuç: 4c6bcdd55f3153e1939669ab1ec039e4059174dc25abdfcb2f58868849b4d61b - Görebileceğiniz gibi iki "merhaba"yı da hashlediğimizde aynı sonuç üretiliyor.
hash("merhaba" + generateSalt()/* generateSalt() sonucu A25k8LW10y olsun*/) // Sonuç: dfda9bd32f19b16163003201d6eb124dda16584b7700fe129ae558fea57101df - "merhaba"yı hashlediğimizde aldığımız sonuçtan farklı bir sonuç aldık.
hash("merhaba" + generateSalt()/* generateSalt() sonucu ed4yu028sc olsun*/) // Sonuç: 0a80c9879a53a4b07de29a2020451789823aeda8b0e540e105def830c7fc88da - Hem "merhaba"yı hashlediğimizde aldığımız sonuçtan hem de bir önceki ürettiğimiz saltla "merhaba"yı hashlediğimizde aldığımız sonuçtan farklı bir sonuç aldık.
// Sizin yapmanız gereken ise oluşturulan salt değerini kaydedilen yerden çekip sonraki işlemlerinizde de bunu kullanmaktır.
hash("merhaba" + db_get("salt")/* Veritabanına önceden kaydedilen değer s4e6Rf78tr9 olsun*/) // Sonuç: 71d28410bd0405fcca6ac2874550dce512c46453e5c368af729871bbdbe39683
// Varsayalım ki
// let değişkenİsmi = değer; ifadesi "değişkenİsmi" isimli değişkenin değerini "değer" olarak ayarlar ve sonrasında "değişkenİsmi" yazılan yerlerde bu değerin kullanılmasını sağlıyor.
// Ayrıca ` karakteri ile açılan stringlerde "${x}" ifadesi "x" isimli değişkenin değerini veriyor olsun.
// if (condition) { run1 } else { run2 } ifadesi de condition doğru ise run1, değilse run2 kısmındaki kodu yürütüyor olsun.
// a == b ise a değişkeninin değeri ile b değişkeninin değeri eşit ise doğru değilse yanlış olduğunu dönüyor olsun.
// **Oyuncu kayıt olurken (username, email ve password değerleri kullanıcıdan alınmış olsun):
let salt = generateSalt();
db_set(`${username}.salt`, salt) // Diyelim ki q0szdf47wJ1FG34k olsun.
let gPassword = hash(hash(password/* Şifre diyelim ki testşifre olsun. */) + salt); // Algoritmanın sonuç olarak ürettiği ve değişkene atadığımız şifre: cb5c246b73ba546f6a989f8a851d3d8cc62ed880756c1028a910652f4b0a49a8
db_set(`${username}.password`, gPassword)
// **Oyuncu giriş yaparken (username ve password değerleri kullanıcıdan alınmış olsun):
let salt = db_get(`${username}.salt`) // Gelen veri: q0szdf47wJ1FG34k
let gPassword = db_get(`${username}.password`) // Gelen veri: cb5c246b73ba546f6a989f8a851d3d8cc62ed880756c1028a910652f4b0a49a8
let kPassword = hash(hash(password) + salt)
if (gPassword == kPassword) {
// Şifre doğru girildi.
} else {
// Şifre yanlış girildi.
}
// NOT: Kullanacağınız dile ve veritabanı türüne göre kullanacağınız kodu değiştirmelisiniz, bu sadece bir örnektir.
zFix#0001
Size şöyle göstereyimBelirli bir yazılım bilginizin olduğunu ama salt mantığını bilmediğiniz için yanlış yaptığınızı düşünüyorum. Bir kişi için salt her seferinde tekrar oluşturulmaz (ama her kişiye farklı bir tane oluşturulur), bir kez oluşturulup veritabanına kaydedilir ve daha sonrasında saltlanacak hash verileri üretilirken bu salt değeri çekilir ve kullanılır yani yeniden üretilmez, örnek vererek açıklayayım:
JavaScript:// Varsayalım ki // generateSalt(): Rastgele 10 karakter üretsin. // hash(value): "value" parametresini SHA256 ile hashleyip hex çıktısını versin. // db_get(name): "name" parametresiyle eşleşen veriyi veritabanından çekip sonucunu versin. // db_set(name, value): "name" parametresinin değerini "value" parametresindeki değere ayarlayıp veritabanına kaydetsin. hash("merhaba") // Sonuç: 4c6bcdd55f3153e1939669ab1ec039e4059174dc25abdfcb2f58868849b4d61b hash("mrhaba") // Sonuç: 0bcf9828fdbdd3d196228764b5176d5f2129182b91899a8d25c6e8965b21fc03 hash("merhaba") // Sonuç: 4c6bcdd55f3153e1939669ab1ec039e4059174dc25abdfcb2f58868849b4d61b - Görebileceğiniz gibi iki "merhaba"yı da hashlediğimizde aynı sonuç üretiliyor. hash("merhaba" + generateSalt()/* generateSalt() sonucu A25k8LW10y olsun*/) // Sonuç: dfda9bd32f19b16163003201d6eb124dda16584b7700fe129ae558fea57101df - "merhaba"yı hashlediğimizde aldığımız sonuçtan farklı bir sonuç aldık. hash("merhaba" + generateSalt()/* generateSalt() sonucu ed4yu028sc olsun*/) // Sonuç: 0a80c9879a53a4b07de29a2020451789823aeda8b0e540e105def830c7fc88da - Hem "merhaba"yı hashlediğimizde aldığımız sonuçtan hem de bir önceki ürettiğimiz saltla "merhaba"yı hashlediğimizde aldığımız sonuçtan farklı bir sonuç aldık. // Sizin yapmanız gereken ise oluşturulan salt değerini kaydedilen yerden çekip sonraki işlemlerinizde de bunu kullanmaktır. hash("merhaba" + db_get("salt")/* Veritabanına önceden kaydedilen değer s4e6Rf78tr9 olsun*/) // Sonuç: 71d28410bd0405fcca6ac2874550dce512c46453e5c368af729871bbdbe39683
Kullandığınızı belirttiğiniz AuthMe pluginini () inceledim ve çıkarımlarımı olayın gerekli bölümlerini anlatarak paylaşmak istiyorum.Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
Yani en başta örnek olarak gösterdiğim mantıkla incelersek:
- Bir kullanıcı kayıt edilirken:
- Oyuncunun girdiği komut ile (veya siteden kayıt olunuyorsa oradan) email, kullanıcı adı ve şifre gibi bilgiler alınıyor.
- email veya kullanıcı ismi önceden kullanılmış mı, uygun mu gibi kontroller gerçekleştiriliyor ve sorun çıkmazsa adımlar devam ediyor.
- Güvenlik için şifre önce hashleniyor, sonra bu hashlenmiş değerin sonuna yeni üretilen 16 haneli bir salt ekleniyor ve bu iki string'in birleşimi olan string tekrar hashleniyor.
- Veritabanında uygun bölüme email, kullanıcı adı, sonuç olarak çıkan şifre ve salt kaydediliyor (aslında bunlarla beraber kayıt tarihi, id, uuid gibi veriler de kaydediliyor). Kayıt işlemi bitirilmiş olunuyor.
- Bir kullanıcı giriş yaparken:
- Oyuncudan email veya kullanıcı ismi ve şifre alınıyor.
- email veya kullanıcı ismi veritabanında sorgulanıyor ve kişiye ait bilgiler çekiliyor (hashlenmiş olarak hashlenmiş şifre ve saltın birleşimi olan sonuç değer ve salt bilgileri alınıyor).
- Oyuncudan alınmış şifre kayıt aşamasında olduğu gibi önce hashleniyor, sonra veritabanından çekilen salt değeri bunun sonuna ekleniyor ve ikisinin birleşimi olan değer tekrar hashleniyor. Burada sonuç olarak oyuncunun girdiği şifre doğruysa veritabanına kaydedilmiş hashlenmiş şifrenin aynısı olan bir sonuç çıkıyor ve birbirine eşit olduğu anlaşılınca giriş işlemi başarılı oluyor, eğer yanlış bir şifre girildiyse oluşan sonuç ile veritabanına kaydedilen şey aynı olmuyor ve eşit olmadıkları anlaşılınca giriş isteği başarısızlıkla sonuçlanıyor.
JavaScript:// Varsayalım ki // let değişkenİsmi = değer; ifadesi "değişkenİsmi" isimli değişkenin değerini "değer" olarak ayarlar ve sonrasında "değişkenİsmi" yazılan yerlerde bu değerin kullanılmasını sağlıyor. // Ayrıca ` karakteri ile açılan stringlerde "${x}" ifadesi "x" isimli değişkenin değerini veriyor olsun. // if (condition) { run1 } else { run2 } ifadesi de condition doğru ise run1, değilse run2 kısmındaki kodu yürütüyor olsun. // a == b ise a değişkeninin değeri ile b değişkeninin değeri eşit ise doğru değilse yanlış olduğunu dönüyor olsun. // **Oyuncu kayıt olurken (username, email ve password değerleri kullanıcıdan alınmış olsun): let salt = generateSalt(); db_set(`${username}.salt`, salt) // Diyelim ki q0szdf47wJ1FG34k olsun. let gPassword = hash(hash(password/* Şifre diyelim ki testşifre olsun. */) + salt); // Algoritmanın sonuç olarak ürettiği ve değişkene atadığımız şifre: cb5c246b73ba546f6a989f8a851d3d8cc62ed880756c1028a910652f4b0a49a8 db_set(`${username}.password`, gPassword) // **Oyuncu giriş yaparken (username ve password değerleri kullanıcıdan alınmış olsun): let salt = db_get(`${username}.salt`) // Gelen veri: q0szdf47wJ1FG34k let gPassword = db_get(`${username}.password`) // Gelen veri: cb5c246b73ba546f6a989f8a851d3d8cc62ed880756c1028a910652f4b0a49a8 let kPassword = hash(hash(password) + salt) if (gPassword == kPassword) { // Şifre doğru girildi. } else { // Şifre yanlış girildi. } // NOT: Kullanacağınız dile ve veritabanı türüne göre kullanacağınız kodu değiştirmelisiniz, bu sadece bir örnektir.
Konudan bağımsız olarak size eğer bu tür şeylerde bilgi sahibi olmak ve gelişmek istiyorsanız birkaç dilde araştırmayı ve ilgili/benzer şeylerin kaynak kodları paylaşılmışsa bulup yorumlamayı öğrenmenizi tavsiye ederim. Örneğin yukarıda da paylaştığım github linkini kullanarak authme'nin kaynak kodlarını inceleyebilirsiniz,adresinde de geliştiricilere yardımcı olması için örnekler vermişler.Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
Her kişi için farklı bir salt oluşturulur ve hash alınırken tek bir karakter değişse bile sonuç değişeceği için farklı saltlar kullanıldığında da sonuç değişecektir ve amaçlanan şeylerden biri de budur. Ama kullanıcı ile ilgili işlemleri yaparken önceki mesajımda anlattığım gibi her işlemde yeni salt üreterek değil, üretilmiş ve db'e kaydedilmiş saltı kullanarak işlemleri gerçekleştirmelisiniz yoksa şifre doğruysa bile hashlenmeden önce sonuna eklenen farklı saltlar hash sonucunu değiştirecektir ve bu iki değeri karşılaştırdığınızda farklı yani yanlış çıkacaklardır.Size şöyle göstereyim
Burada kullandığım şifre merhaba
Ekli dosyayı görüntüle 188501
Burada da aynı şifreyi kullanıyorum
Ekli dosyayı görüntüle 188502Ve sonuç böyle
İlk hash: $SHA$133d77203f4192e3$a9b84c995e6ff26e63f0f197f3a708d4b7e8c8c1b8c4d4156cc8e8207ab8ea68
İkinci hash: $SHA$838a3f022ce479dc$f917af3727d7be56caa526bdff2aa97cf2e8c9b10c45c1bccce6aee3f58d6bef
2 sinde de aynı şifre ve kullanıcı adı kullandım.
Yanlış anladığım bir yer varmı?
AuthMe kayıt sırasında zaten bunu password isimli sütuna kaydediyor. O sütundaki verinin biçimi şu şekilde:hmm saltı nasıl kaydedeceğim db ye ki oyundan login / register yapıyorlar
"$SHA$" + salt + "$" + hash(hash(password) + salt). Önceki mesajımdaki örneği attığım linki inceleyerek yorumlarsınız diye düşündüğüm için fazla detaya inmiyorum, ulaşmak isteyebileceğiniz her şey o linkte var.zFix#0001
Büyük bir topluluğun parçası ol, etkinliklere katıl ve özel hediyeler kazanma şansı yakala!