Bu konuda Delphiye yeni başlayanlar için basit yolla md5 kullanımı anlatacağım.
Md5 nedir ? -Md5 bir doğrulama algoritmasıdır. Verdiğiniz değeri karışık bir algoritmaya sokarak 128-bit 32 haneli olarak size geri döndürür. Dönen değerin geri dönüşümü yoktur ve aynı metin için her seferinde aynı değer geri döner.
Kullanmak için yapmamız gerekenler;
Öncelikle alttaki Kırmızı kısım (//Md5 Kütüphanesi - //Md5 Kütüphane Kod Sonu) arasında bulunan kodları kopyalayıp bilgisayarınızda bir yeni bir metin belgesi oluşturun, kodları içine yapıştırıp ve md5.pas olarak kaydedin.
//Md5 Kütüphanesi
unit MD5;
interface
type Dizi= Array of integer;
function MD_5(str: string): string;
implementation
function rhex(num: integer): string; var str,hex_chr: string; j: integer; begin hex_chr:='0123456789abcdef'; str:=''; for j:=0 to 3 do str:=str+hex_chr[((num shr (j*8+4)) and $F)+1]+hex_chr[((num shr (j*8)) and $F)+1]; Result:=str; end;
function str2blks_MD5(str: string): Dizi; var nblk: integer; blks: Dizi; i: integer; begin nblk:=((length(str)+8) shr 6)+1; SetLength(blks,nblk*16); for i:=0 to nblk*16-1 do blks[i]:=0; for i:=0 to length(str)-1 do blks[i shr 2]:=blks[i shr 2] or ((ord(str[i+1]) shl ((i mod 4)*8))); blks[i shr 2]:=blks[i shr 2] or ($80 shl ((i mod 4)*8)); blks[nblk*16-2]:=length(str)*8; Result:=blks; end;
function add(x,y: integer): integer; var lsw,msw: integer; begin lsw:=(x and $FFFF)+(y and $FFFF); msw:=(x shr 16)+(y shr 16)+(lsw shr 16); Result:=(msw shl 16) or (lsw and $FFFF); end;
function rol(num,cnt: integer): integer; begin Result:=(num shl cnt) or (num shr (32 - cnt)); end;
function cmn(q, a, b, x, s, t: integer): integer; begin Result:= add(rol(add(add(a, q), add(x, t)), s), b); end;
function ff(a, b, c, d, x, s, t: integer): integer; Begin Result:= cmn((b and c) or ((not b) and d), a, b, x, s, t); end;
function gg(a, b, c, d, x, s, t: integer): integer; Begin Result:= cmn((b and d) or (c and (not d)), a, b, x, s, t); end;
function hh(a, b, c, d, x, s, t: integer): integer; Begin Result:= cmn(b xor c xor d, a, b, x, s, t); end;
function ii(a, b, c, d, x, s, t: integer): integer; Begin Result:= cmn(c xor (b or (not d)), a, b, x, s, t); end;
function MD_5(str: string): string; var x: dizi; a,b,c,d,olda,oldb,oldc,oldd: integer; i: integer; begin x:= str2blks_MD5(str); a:= 1732584193; b:= -271733879; c:= -1732584194; d:= 271733878;
i:=0; while i<length(x) do begin olda := a; oldb := b; oldc := c; oldd := d;
a := ff(a, b, c, d, x[i+ 0], 7 , -680876936); d := ff(d, a, b, c, x[i+ 1], 12, -389564586); c := ff(c, d, a, b, x[i+ 2], 17, 606105819); b := ff(b, c, d, a, x[i+ 3], 22, -1044525330); a := ff(a, b, c, d, x[i+ 4], 7 , -176418897); d := ff(d, a, b, c, x[i+ 5], 12, 1200080426); c := ff(c, d, a, b, x[i+ 6], 17, -1473231341); b := ff(b, c, d, a, x[i+ 7], 22, -45705983); a := ff(a, b, c, d, x[i+ 8], 7 , 1770035416); d := ff(d, a, b, c, x[i+ 9], 12, -1958414417); c := ff(c, d, a, b, x[i+10], 17, -42063); b := ff(b, c, d, a, x[i+11], 22, -1990404162); a := ff(a, b, c, d, x[i+12], 7 , 1804603682); d := ff(d, a, b, c, x[i+13], 12, -40341101); c := ff(c, d, a, b, x[i+14], 17, -1502002290); b := ff(b, c, d, a, x[i+15], 22, 1236535329);
a := gg(a, b, c, d, x[i+ 1], 5 , -165796510); d := gg(d, a, b, c, x[i+ 6], 9 , -1069501632); c := gg(c, d, a, b, x[i+11], 14, 643717713); b := gg(b, c, d, a, x[i+ 0], 20, -373897302); a := gg(a, b, c, d, x[i+ 5], 5 , -701558691); d := gg(d, a, b, c, x[i+10], 9 , 38016083); c := gg(c, d, a, b, x[i+15], 14, -660478335); b := gg(b, c, d, a, x[i+ 4], 20, -405537848); a := gg(a, b, c, d, x[i+ 9], 5 , 568446438); d := gg(d, a, b, c, x[i+14], 9 , -1019803690); c := gg(c, d, a, b, x[i+ 3], 14, -187363961); b := gg(b, c, d, a, x[i+ 8], 20, 1163531501); a := gg(a, b, c, d, x[i+13], 5 , -1444681467); d := gg(d, a, b, c, x[i+ 2], 9 , -51403784); c := gg(c, d, a, b, x[i+ 7], 14, 1735328473); b := gg(b, c, d, a, x[i+12], 20, -1926607734);
a := hh(a, b, c, d, x[i+ 5], 4 , -378558); d := hh(d, a, b, c, x[i+ 8], 11, -2022574463); c := hh(c, d, a, b, x[i+11], 16, 1839030562); b := hh(b, c, d, a, x[i+14], 23, -35309556); a := hh(a, b, c, d, x[i+ 1], 4 , -1530992060); d := hh(d, a, b, c, x[i+ 4], 11, 1272893353); c := hh(c, d, a, b, x[i+ 7], 16, -155497632); b := hh(b, c, d, a, x[i+10], 23, -1094730640); a := hh(a, b, c, d, x[i+13], 4 , 681279174); d := hh(d, a, b, c, x[i+ 0], 11, -358537222); c := hh(c, d, a, b, x[i+ 3], 16, -722521979); b := hh(b, c, d, a, x[i+ 6], 23, 76029189); a := hh(a, b, c, d, x[i+ 9], 4 , -640364487); d := hh(d, a, b, c, x[i+12], 11, -421815835); c := hh(c, d, a, b, x[i+15], 16, 530742520); b := hh(b, c, d, a, x[i+ 2], 23, -995338651);
a := ii(a, b, c, d, x[i+ 0], 6 , -198630844); d := ii(d, a, b, c, x[i+ 7], 10, 1126891415); c := ii(c, d, a, b, x[i+14], 15, -1416354905); b := ii(b, c, d, a, x[i+ 5], 21, -57434055); a := ii(a, b, c, d, x[i+12], 6 , 1700485571); d := ii(d, a, b, c, x[i+ 3], 10, -1894986606); c := ii(c, d, a, b, x[i+10], 15, -1051523); b := ii(b, c, d, a, x[i+ 1], 21, -2054922799); a := ii(a, b, c, d, x[i+ 8], 6 , 1873313359); d := ii(d, a, b, c, x[i+15], 10, -30611744); c := ii(c, d, a, b, x[i+ 6], 15, -1560198380); b := ii(b, c, d, a, x[i+13], 21, 1309151649); a := ii(a, b, c, d, x[i+ 4], 6 , -145523070); d := ii(d, a, b, c, x[i+11], 10, -1120210379); c := ii(c, d, a, b, x[i+ 2], 15, 718787259); b := ii(b, c, d, a, x[i+ 9], 21, -343485551);
a := add(a, olda); b := add(b, oldb); c := add(c, oldc); d := add(d, oldd);
inc(i,16); end; Result:= rhex(a) + rhex(b) + rhex(c) + rhex(d); end;
end.
//Md5 Kütüphane Kod Sonu
== Kullanımı ==
Md5.pas dosyamızı projemizin klasörüne atıyoruz. ( Delphi kütüphanesine de atabilirsiniz )
Formunuza 2 tane edit ve 1 tane button atın.
Uses md5;
procedure TForm1.Button1Click(Sender: TObject); begin edit2.Text := MD_5(edit1.Text); // Edit1'e girdiğim değerin md5 karşılığını edit2'de yaz... end;
Buton1'e tıkladığınızda edit2'de edit1'deki metnin md5 karşılığını görürsünüz.
Şimdi md5 kontrolü ile doğrulama yapalım.
Kodları Aşağıdaki şekilde yazıyoruz...
procedure TForm1.Button1Click(Sender: TObject); begin if (MD_5(edit1.Text) = '21232f297a57a5a743894a0e4a801fc3') and (MD_5(Edit2.text) = 'cfdec2ef38bd45584cc77d71b14efdfb') then // Eğer edit1'e girilen değer "admin" ve edit2'ye girilen değer "datakent" ise showmessage('Giriş Doğrulandı...' + #13#10 + 'Kullanıcı adı : admin' + #13#10 + 'Şifre : datakent' ) else showmessage('Kullanıcı adı ya da şifre hatalı!'); end;
Eğer edit1'e ''admin"" edit2'ye ""datakent"" yazıp butona tıklarsanız koddaki md5 ile karşılaştıracak ve md5 karşılığı doğruladıktan sonra girişin başarılı olduğunua dair mesaj verecektir.
21232f297a57a5a743894a0e4a801fc3 = md5 olarak karşılığı "admin"
cfdec2ef38bd45584cc77d71b14efdfb = md5 olarak karşılığı "datakent"
* Md5 doğrulama algoritması büyük küçük harf duyarlıdır... Bu hususa dikkat ediniz.
== Md5 Çözümleme ==
Md5 ile dönen değerden asıl değere ulaşmak imkansızdır ya da imkasıza yakın birşeydir :) Zaten geri döndürülebilse bir anlamı olmazdı.
Doğrulama işlemini wordlist kullanılabilir. Girdiğiniz md5 değerini şifre listenizdeki şifrelerle karşılaştıran bir uygulama ile md5 kodunu bir ihtimal decode edebilirsiniz.
Örnek verecek olursak elinizdeki md5 değeri "17459b9b3e7a90e895cf72b30245abe4" bu olsun.
Listenizdede bulunan değerler şöyle olsun
// 1234 12345 123456 sifre parola parolabasak testmd5 ali veli deneme //
Siz bir döngüye sokup Listenizi bu md5 kodu ile karşılaştırdğınızda "parolabasak" değerine geldiğinide doğrulama olacaktır. Çünkü "17459b9b3e7a90e895cf72b30245abe4" bu deger "parolabasak" kelimesinin md5 degeridir.
Takılan ya da sorun yaşayan olursa bu konu altına yazsın yardımcı olmaya çalışırım...
Dip not : Md5 bir şifreleme algortiması değil doğrulama algoritmasıdır...
|