it-swarm-tr.com

Ne tür kodlama / şifreleme kullanıldığını nasıl belirleyebilirim?

Ne tür bir şifreleme/kodlama kullanıldığını bulmanın bir yolu var mı? Örneğin, şifreyi veritabanında şifreli bir biçimde saklayan bir web uygulamasını test ediyorum (WeJcFMQ/8+8QJ/w0hHh+0g==). Hangi karma veya şifrelemenin kullanıldığını nasıl belirlerim?

156
Karthik

Örnek dizeniz (WeJcFMQ/8+8QJ/w0hHh+0g==), 16 baytlık bir dizi için Base64 kodlamasıdır ve anlamlı olmayan ASCII veya UTF-8 gibi görünmez. If bu şifre için saklanan bir değerdir - doğrulama (yani gerçekten "şifreli" bir şifre değil, "karma" bir şifre), bu muhtemelen şifre üzerinde hesaplanan bir karma işlevinin sonucudur; 128 bit çıkışlı bir klasik karma işlevi MD5 ama her şey hakkında olabilir.

Bunu bilmenin "normal" yolu uygulama koduna bakmaktır. Uygulama kodu, gizli bir anahtarın yapabileceği kadar korunmayan ve korunamayan, somut, şişman bir şekilde (bir sunucudaki yürütülebilir dosyalar, bir yerde kaynak kodu ...) enkarne edilir. Dolayısıyla tersine mühendislik "gidilecek yol" dur.

Tersine mühendislik yasaklamak, eğitimli tahminler yapmak için birkaç deney yapabilirsiniz:

  • Aynı kullanıcı parolasını "değiştirir", ancak yeniden kullanırsa, depolanan değer değişir mi? Evetse, değerin bir kısmı muhtemelen rastgele bir "tuz" veya IV'tür (simetrik şifreleme varsayarak).
  • Belirli bir kullanıcı için parolanın değerinin deterministik olduğunu varsayarsak, iki kullanıcı aynı parolayı seçerse, aynı saklanan değere neden olur mu? Hayırsa, kullanıcı adı büyük olasılıkla hesaplamanın bir parçasıdır. Bir eşleşme alıp almadığınızı görmek için MD5'i ("kullanıcı adı: şifre") veya diğer benzer varyantları hesaplamayı deneyebilirsiniz.
  • Parola uzunluğu sınırlı mı? Yani, 40 karakterlik bir şifre ayarlarsanız ve yalnızca ilk 39 karakteri yazarak başarılı bir şekilde kimlik doğrulaması yapamazsanız, bu, tüm karakterlerin önemli olduğu anlamına gelir ve bunun gerçekten şifre olduğunu ima eder hashing, değil - şifreleme (saklanan değer bir parolayı doğrulamak için kullanılır, ancak parola yalnızca saklanan değerden kurtarılamaz).
140
Thomas Pornin

Düzenleme: Ben sadece hashID adında çok güzel bir komut dosyası fark ettim. İsim hemen hemen bunu anlatıyor.

~~~

Genel olarak konuşursak, tecrübeli tahminler yapmak için deneyim kullanmak, bunların nasıl yapıldığıdır.

Her birinin nasıl göründüğünü ve imza/desen oluşturduğunu veya sadece optik olarak doğruladığını bilmeniz için çok sayıda karma çıktıya sahip bir liste.

İlk önce dikkat ettiğiniz iki ana şey vardır:

  • karma uzunluğu (her karma işlevinin belirli bir çıkış uzunluğu vardır)
  • kullanılan alfabe (tüm İngilizce harfler mi? 0-9 arası rakamlar ve A-F yani hex? Varsa hangi özel karakterler var?)

Birkaç şifre kırma programı (örneğin John ripper) kullanılan algoritmayı tahmin etmek için girişe bazı desen eşleşmeleri uygular, ancak bu sadece genel karmalarda çalışır. Örneğin, herhangi bir karma çıktı alır ve her harfi 1 döndürürseniz, çoğu desen eşleme şeması başarısız olur.

68
john

Gönderdiğiniz, temel 64 kodlanmış verilerin 16 bayt (128 bit) değeridir. Base 64 kodlanmış olması bize fazla bir şey söylemez çünkü base 64 bir şifreleme/karma algoritması değildir, ikili verileri metne kodlamanın bir yoludur. Bu, bu bloğun yararlı bir bilgi parçası, yani çıktının 16 bayt uzunluğunda olduğu anlamına gelir. Bunu, yaygın olarak kullanılan şemaların blok boyutu ile karşılaştırabilir ve ne olamayacağını anlayabiliriz. Şimdiye kadar en yaygın şemalar:

Yapmamız gereken bir sonraki şey, aşağıdaki sorunun cevabını bulmak için diğer şifre metni bloklarına bakmaktır:

  • Farklı giriş uzunlukları için bile tüm şifre metinleri aynı uzunlukta mi?

Tüm bloklar aynı uzunlukta değilse, bir karma algoritmasına değil, bir şifreleme algoritmasına bakıyorsunuzdur. Çıktı her zaman altta yatan blok boyutunun katları olacağından, 16 bayta eşit olarak bölünemeyen bir blokun varlığı, AES olamaz ve bu nedenle DES veya 3DES) anlamına gelir.

Parola koyma ve çıktıyı gözlemleme yeteneğiniz varsa, bu çok hızlı bir şekilde belirlenebilir. Sadece 17 karakterlik bir şifre girin ve uzunluğa bakın. 16 baytında MD5 varsa, 20 bayt SHA-1, 24 bayt DES veya 3DES, 32 bayt AES anlamına gelir).

26
Yaur

Bu gerçekten basit bir şifre karmasıysa Google'ı kırmak için kullanabiliriz olabilir. Ancak, tüm bu eğik çizgiler ve artı işaretleriyle Base64'ü aramak zordur, bu yüzden önce bu karmayı onaltılık biçime dönüştürelim:

$ Perl -MMIME::Base64 -le 'print unpack "H*", decode_base64 "WeJcFMQ/8+8QJ/w0hHh+0g=="'
59e25c14c43ff3ef1027fc3484787ed2

Tamam, şimdi Google için . Şu anda, sadece bir hit , md5this.com - Açıkçası bu yazı da dahil olmak üzere çok yakında olacak olsa da.

Maalesef (veya neyse ki, bakış açınıza bağlı olarak), aslında bir preimage bulabilecek kadar şanslı değiliz (site şu anda bu hashı "çatlıyor ..." olarak listeliyor), ancak o listede olması gerçeği bunun gerçek bir şifrenin gerçekten de tuzsuz bir MD5 karması olduğunu şiddetle öneririz.

6
Ilmari Karonen

Biçime bağlıdır - şifreli metni depolamak için bazı protokollerde, nasıl şifreleneceğini tanımlayan açık metin bölümü bulunur. Örneğinizden, başvurduğunuz dize çok kısa olduğu için şüpheli değilim, sadece şifrelenmiş metin gibi görünüyor.

Birkaç düşünce öneririm:

  • Sonunda "==" kesinlikle dolgu olacaktır, bu yüzden herhangi bir şifre çözme girişimi dahil etmeyin.

  • Şifreleme yerine bir karma veya tuzlanmış bir karma ile uğraşıyor olabilirsiniz. Bu durumda, verilerin şifresini çözmeye çalışmak işe yaramaz - orijinal olarak kullanılan aynı karma ve/veya tuz değerini kullanarak şifreleri eşleştirmeniz gerekir. Orijinal değeri elde etmenin tuzlu bir şifresiyle yolu yoktur.

  • Mutlak en iyi seçeneğiniz, şifreleri saklamak için kullanılan kodun bir kopyasını almaktır. Orada bir yerlerde şifreler kriptografik bir işlemden geçiyor. Burada neler olduğunu öğrenmek için kodu bulun. Her 10 üzerinden 9 kez, karma/tuzlama/şifreleme için bir çeşit API kullanıyorlar ve aynı API'yı kullanarak taklit edebilir veya tersine çevirebilirsiniz.

6
bethlakshmi

Kodlama genel olarak tahmin edilebilir. Örneğin, sorunuzda yayınladığınız dize Base64 kodludur. Eşittir işaretleri Base64 şemasında dolgu. Bu, deneyimle ilgili görüşte bildiğim bir şey.

Bana şifrelenmiş bir dize verdiyseniz, size kodlamayı söyleyebilirim, ancak bir tür meta veri mevcut olmadığı sürece bunu şifrelemek için kullanılan algoritmayı söyleyemem. Nedeni şudur: şifreleme algoritmaları rastgele veri gibi görünen şeyleri üreterek çalışır. Eğer her biri iki şifre (dört çıktı) ile iki cümle şifrelersem, şifresini çözmezseniz veya şifreyi kırmazsanız hangi şifre metninin hangi şifreye ait olduğunu güvenle söyleyemezdiniz.

Özel durumunuzla ilgili olarak, şifreler genellikle karma yapılır. Bu, şifreyi karmadan kurtaramayacağınız anlamına gelir, ancak karma'nın şifre ile eşleşip eşleşmediğini test edebilirsiniz. Bu bağlamda, @ john'un cevabı altındır. Bildiğiniz bir parola girebilir ve ardından buna karşı ortak şemalar deneyebilirsiniz, kullanılan karma'nın ne olduğunu öğrenebilirsiniz.

6
Jeff Ferland

Tek yol tahmin etmektir. Deneyim ile tahmin çalışmaları daha doğru olacaktır.

Örneğin: Çıktı uzunluğuna bağlı olarak: MD5 çıkışı 128 bit veya 16 bayttır, SHA1 çıkışı 160 bit veya 20 bayttır. Çıktı karakter kümesine göre: BASE64 yazdırılabilir karakterlerle çıktı üretir.

Günün sonunda, size nasıl yapılacağını öğreten deneme yanılma yaklaşımıdır.

4
Nam Nguyen

Bu, tüm cephelerde çok zayıf bir güvenlik! Düz metin P4 $$ w0rdP4 $$ w0rd ve XOR şifreleme, anahtar CdZ4MLMPgYtAE9gQ80gMtg == ile şifrelenir. Yukarıdaki OP tarafından gönderilen şifreli metin, WeJcFMQ/8 + 8QJ/w0hHh + 0g ==.

Doğrulamak için:

İlk olarak, düz metnin temel ikilisini almak için xxd kullanın:

echo -n 'P4$$w0rdP4$$w0rd' | xxd -b -c16

Bu şunu üretir:

01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100

Daha sonra, base64 kodunun kodunu çözün ve anahtarın temel ikili kodunu almak için xxd kullanın:

echo -n 'CdZ4MLMPgYtAE9gQ80gMtg==' | base64 -d | xxd -b -c16

Bu şunu üretir:

00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110

Şimdi, XOR iki ikili dize:

01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100  (plaintext)
[XOR]
00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110  (key)
-----------------------------------------------------------------------------------------------------------------------------------------------
01011001 11100010 01011100 00010100 11000100 00111111 11110011 11101111 00010000 00100111 11111100 00110100 10000100 01111000 01111110 11010010  (ciphertext)

Son olarak, ikili şifre metnini base64'e dönüştürmek için bc, xxd ve base64 kullanın:

echo "obase=16; ibase=2; 01011001111000100101110000010100110001000011111111110011111011110001000000100111111111000011010010000100011110000111111011010010" | bc | xxd -p -r | base64

Bu, yukarıdaki soruda OP tarafından yayınlanan şifreli metin olan WeJcFMQ/8 + 8QJ/w0hHh + 0g == üretir.


Bu cevabın ters görünmesi durumunda özür dilerim. Kuşkusuz öyle. Posterin sadece bazı şifre metinleri sağladığı ve şifre metninin nasıl üretilebileceğine dair bir fikir istediği buna benzer sorular, security.stackexchange.com'da oldukça sık ortaya çıkıyor gibi görünüyor; ve bu soru genellikle bu soruların kopyası olarak ifade edilir. Bu cevabın amacı, bu tür soruların cevapsız olduğunu göstermektir, çünkü bu tür sorulara sonsuz çözümler vardır.

1
mti2935

Tek yol, size söyleyen bazı meta veriler olduğunda. Örneğin, son zamanlarda PDF'lerle çalışıyorum ve biçim, filtre, algoritma, anahtar boyutu vb. İçeren bir sözlük içeriyor. Ancak elinizde yalnızca şifre metni varsa, sahip olduğunuz tek şey veri.

1
user185