Delphi – Checksum Hesaplama

Oluşturulmuş bir dosyanın içeriğinin değişip değiştirilmediğini anlamanın en garantili yolu hash bilgisini oluşturup kaydetmek ve daha sonra dosyanın hash bilgisi ile kayıt edilen hash bilgisini karşılaştırmaktır. Hash verisi dosyaların parmak izleri gibi düşünülebilir.
Günümüzde bilgisayar kullanımı arttıkça bununla paralel dosya paylaşımları da artmakta ve dosyalar transfer esnasında bozulabilmektedir. Dosyaların bozulup bozulmadığını anlamanın yolu olarak hash kaydı tutulmaktadır. MD5 ve SHA gibi güçlü algoritmalar ile şifrelenip kayıt edilen hash değeri dosya oluşturulduğunda yanında verilir.
5651 Loglama yasasına göre Loglama yapan bir yazılımı geliştirirken log dosyasının içeriğinin bir şekilde değiştirilmediğinden emin olmam gerekiyordu ki bu yasal bir zorunluluktur.
Delphi ile yaptığım bir çalışmayı başkalarında işine yarayacak şekilde program haline getirdim. Yazılım seçilen dosyanın MD5, SHA1, SHA256, SHA384, SHA512 Hash değerlerini hesaplamakta ve dilerseniz .hash uzantılı olarak kayıt etmektedir.
İçeriğin değiştirilmediğini test etmek için “Dosya-Karşılaştır” seçeneğini seçip açılan menüden dosya ve hash dosyasını gösterip kontrol et butonuna basılır ve sağ taraftaki yuvarlak şekiller Yeşil yada Kırmızı olarak geçerli veya geçersiz dosya bilgisi verir.
Uygulamada bilgi amaçlı MD5, SHA1, SHA256, SHA384, SHA512 hash değerleri hesaplanmaktadır. Uygulamada sadece birini hesaplayıp kullanmak yeterlidir. Eğer kendiniz düzenleyip kullanmak isterseniz kaynak kodlarını paylaşacağım.
Programı Delphi 10 Seattle ile geliştirdim. Standart kütüphaneler kullandım. Indy kütüphaneleri standartta geldiği için extra component yüklemenize gerek kalmaz.
Programın bir kaç ekran görüntüsüne bakalım.
Programı açtığınızda aşağıdaki şekilde ekran göreceksiniz. Sağ üst köşede bulunan “. . .” butona yada “Dosya->Aç” menüsüne tıkladığınızda seçmeniz için pencere açılacak ve dosyayı seçmenizi isteyecektir. Dosyayı seçtiğinizde program hesaplamaya başlayacak ve adım adım aşağıdaki değerleri size verecektir. Eğer dosya boyutu büyük ise değerleri hesaplaması zaman alabilir bilgilendirmek için aşağıda durum çubuğu ilerleyecektir. Yazı olarak ta size bilgi verecektir.
Dosyanın Hash hesaplarını kaydetmek ve daha sonra dosyanın geçerliliğini doğrulamak isterseniz “Dosya->Kaydet” komutuna tıklayın ve dosyayı istediğiniz yere kaydedin. Kayıt edilen dosya .hash uzantılı olacaktır.
Kayıt edilen dosyayı notpad ile açtığınızda aşağıdaki şekilde bir içerik göreceksiniz.
Dosya içeriğine baktığınızda dosyayı oluşturan programın başlığı, oluşturma tarihi, hangi dosyaya ait olduğu ve dosya yolu, Hash bilgisi MD5, SHA1, SHA256, SHA384, SHA512 formatında yer almaktadır.
Eğer dosyanın içeriğinin değişip değiştirilmediğini teyit etmek isterseniz “Dosya->karşılaştır” seçeneğine tıklayın ve açılan pencerede dosya ve hash dosyasını seçerek “Kontrol Et” butonuna basın.
Eğer içerik değiştirilmedi ise aşağıdaki şekilde bir ekran ile karşılaşacaksınız.
İçerik değiştirildi ise aşağıdaki ekran oluşacaktır.
Burada program dosyanın güncel hash hesaplarını yapıp daha önce kayıt edilen hash hesaplarını karşılaştırarak size bilgi vermektedir. Deneme için Data.txt dosyasına sadece bir harf ekledim ve dosya geçersiz bilgisini almış oldum. Tekrar eski haline getirdiğimde geçerli bilgisini aldım. Buda demek oluyor ki dosya içeriğinde orjinal haline göre bir farklılık olursa dosyamız geçersiz oluyor.
Dosyanın kayıt konumunu ve ismini değiştirdiğimde dosya geçerli oldu. Buda sadece içerik değiştiğinde geçersiz olduğunu gösterir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 |
{ Delphi İle Checksum Hesaplama MD5,SHA-1,SHA256,SHA384,SHA512 Sercan TEK - 20.10.2016 www.sercanca.com Delphi 10 Seattle } unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Vcl.StdCtrls,Vcl.ExtCtrls, Vcl.ComCtrls, Vcl.Menus; type TForm1 = class(TForm) Ac: TButton; OpenDialog1: TOpenDialog; Label1: TLabel; Edit1: TEdit; Edit2: TEdit; Label2: TLabel; Edit3: TEdit; Label3: TLabel; Edit4: TEdit; Label4: TLabel; Edit5: TEdit; Label5: TLabel; Edit6: TEdit; Label6: TLabel; StatusBar1: TStatusBar; Bar: TProgressBar; Label7: TLabel; MainMenu1: TMainMenu; Dosya1: TMenuItem; Hakknda1: TMenuItem; A1: TMenuItem; Kaydet1: TMenuItem; wwwsercancacom1: TMenuItem; SaveDialog1: TSaveDialog; Hakknda2: TMenuItem; Karlatr1: TMenuItem; procedure wwwsercancacom1Click(Sender: TObject); procedure Kaydet1Click(Sender: TObject); procedure hesaplama(dosya:strinG); procedure AcClick(Sender: TObject); procedure Hakknda2Click(Sender: TObject); procedure Karlatr1Click(Sender: TObject); function Dosya_Hash(const FileName: string;Hash_tipi:integer): string; private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses IdHashMessageDigest, IdHashSHA, IdSSLOpenSSL,Winapi.ShellAPI, Unit2; {$R *.dfm} // Dosya SHA hash alma function TForm1.Dosya_Hash(const FileName: string;Hash_tipi:integer): string; var MD5: TIdHashMessageDigest5; SHA1: TIdHashSHA1; SHA256: TIdHashSHA256; SHA384: TIdHashSHA384; SHA512: TIdHashSHA512; Dosya: TFileStream; cikis : String; begin Dosya := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); LoadOpenSSLLibrary; case Hash_tipi of 0 :begin // MD5 MD5 := TIdHashMessageDigest5.Create; try cikis := MD5.HashStreamAsHex(Dosya); finally MD5.Free; end; end; 1 : begin // SHA-1 SHA1 := TIdHashSHA1.Create; try cikis := SHA1.HashStreamAsHex(Dosya); finally SHA1.Free; end; end; 2 : begin // SHA-256 SHA256 := TIdHashSHA256.Create; try cikis := SHA256.HashStreamAsHex(Dosya); finally SHA256.Free; end; end; 3 : begin // SHA-348 SHA384 := TIdHashSHA384.Create; try cikis := SHA384.HashStreamAsHex(Dosya); finally SHA384.Free; end; end; 4 : begin // SHA-512 SHA512 := TIdHashSHA512.Create; try cikis := SHA512.HashStreamAsHex(Dosya); finally SHA512.Free; end; end; end; Dosya.Free; result := cikis; end; procedure TForm1.AcClick(Sender: TObject); begin hesaplama(''); end; procedure TForm1.Hakknda2Click(Sender: TObject); begin Showmessage('Delphi Dosya Checksum Hesaplama - Ekim-2016'); Showmessage('www.sercanca.com'); end; procedure TForm1.hesaplama(dosya:strinG); begin edit1.Clear; edit2.Clear; edit3.Clear; edit4.Clear; edit5.Clear; edit6.Clear; bar.Position := 0 ; if dosya = '' then begin Form1.OpenDialog1.Filter := 'Tum Dosyalar (*.*)|*.*'; Form1.OpenDialog1.FileName :=''; if OpenDialog1.Execute = True then begin Dosya := OpenDialog1.FileName; end; end; if opendialog1.filename = '' then begin exit; end; edit1.Text := Dosya; StatusBar1.Panels[0].Text := 'Durum : Hesaplanıyor...'; application.ProcessMessages; edit2.Text := Dosya_Hash(Dosya,0); StatusBar1.Panels[0].Text := 'Durum : MD5 Hesaplandı'; bar.Position := bar.Position + 20 ; application.ProcessMessages; edit3.Text := Dosya_Hash(Dosya,1); StatusBar1.Panels[0].Text := 'Durum : SHA1 Hesaplandı'; bar.Position := bar.Position + 20 ; application.ProcessMessages; edit4.Text := Dosya_Hash(Dosya,2); StatusBar1.Panels[0].Text := 'Durum : SHA256 Hesaplandı'; bar.Position := bar.Position + 20 ; application.ProcessMessages; edit5.Text := Dosya_Hash(Dosya,3); StatusBar1.Panels[0].Text := 'Durum : SHA384 Hesaplandı'; bar.Position := bar.Position + 20 ; application.ProcessMessages; edit6.Text := Dosya_Hash(Dosya,4); StatusBar1.Panels[0].Text := 'Durum : SHA512 Hesaplandı'; bar.Position := bar.Position + 20 ; application.ProcessMessages; StatusBar1.Panels[0].Text := 'Durum : Hesaplama Bitti Yeni Dosya Açabilirsiniz...'; end; procedure TForm1.Karlatr1Click(Sender: TObject); begin if edit1.Text<>'' then begin form2.dosya_adi.Text := edit1.Text; end; Form2.showmodal; end; procedure TForm1.Kaydet1Click(Sender: TObject); var Liste : TStringList; begin Liste := TStringList.Create; Liste.Add('*********************************************************************'); Liste.Add('* Delphi Dosya Checksum Hesaplama - www.sercanca.com - Ekim-2016 *'); Liste.Add('*********************************************************************'); Liste.Add('Tarih : '+Datetostr(Now)+ '-'+Timetostr(Now)); Liste.Add('Dosya Adı : '+Edit1.Text); Liste.Add(Edit2.Text); Liste.Add(Edit3.Text); Liste.Add(Edit4.Text); Liste.Add(Edit5.Text); Liste.Add(Edit6.Text); savedialog1.Filename := ExtractFileName(edit1.Text)+'_Checksum'; if savedialog1.Execute then begin Liste.SaveToFile(savedialog1.FileName+'.hash'); end; Liste.Free; end; procedure TForm1.wwwsercancacom1Click(Sender: TObject); begin ShellExecute(self.WindowHandle,'open','www.sercanca.com',nil,nil, SW_SHOWNORMAL); end; end. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
unit Unit2; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls; type TForm2 = class(TForm) GroupBox1: TGroupBox; dosya_adi: TEdit; hash_adi: TEdit; Label1: TLabel; Label2: TLabel; Button1: TButton; Button2: TButton; kontrol: TButton; GroupBox2: TGroupBox; Dosya_md5: TEdit; Label3: TLabel; Hash_md5: TEdit; Label8: TLabel; GroupBox3: TGroupBox; Label4: TLabel; Label5: TLabel; Dosya_Sha1: TEdit; Hash_sha1: TEdit; GroupBox4: TGroupBox; Label6: TLabel; Label7: TLabel; Dosya_sha256: TEdit; hash_sha256: TEdit; GroupBox5: TGroupBox; Label9: TLabel; Label10: TLabel; Dosya_Sha384: TEdit; hash_sha384: TEdit; GroupBox6: TGroupBox; Label11: TLabel; Label12: TLabel; Dosya_sha512: TEdit; Hash_sha512: TEdit; sha1_onay: TShape; md5_onay: TShape; sha256_onay: TShape; sha384_onay: TShape; sha512_onay: TShape; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormShow(Sender: TObject); procedure kontrolClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation {$R *.dfm} uses Unit1; procedure temizle; begin Form2.md5_onay.Brush.Color := clwhite; Form2.sha1_onay.Brush.Color := clwhite; Form2.sha256_onay.Brush.Color := clwhite; Form2.sha384_onay.Brush.Color := clwhite; Form2.sha512_onay.Brush.Color := clwhite; form2.Dosya_md5.Clear; form2.Hash_md5.Clear; form2.Dosya_sha1.Clear; form2.Hash_sha1.Clear; form2.Dosya_sha256.Clear; form2.Hash_sha256.Clear; form2.Dosya_sha384.Clear; form2.Hash_sha384.Clear; form2.Dosya_sha512.Clear; form2.Hash_sha512.Clear; end; procedure TForm2.Button1Click(Sender: TObject); begin Form1.OpenDialog1.Filter := 'Tum Dosyalar (*.*)|*.*'; Form1.OpenDialog1.FileName :=''; if Form1.OpenDialog1.Execute = True then begin dosya_adi.text := Form1.OpenDialog1.FileName; temizle; end; end; procedure TForm2.Button2Click(Sender: TObject); begin Form1.OpenDialog1.Filter := 'Hash Dosyasi (*.hash)|*.hash'; Form1.OpenDialog1.FileName :=''; if Form1.OpenDialog1.Execute = True then begin hash_adi.text := Form1.OpenDialog1.FileName; temizle; end; end; procedure TForm2.FormShow(Sender: TObject); begin temizle; if dosya_Adi.Text <> '' then begin Button2.OnClick(self); end; end; procedure TForm2.kontrolClick(Sender: TObject); var Liste : TStringList; begin temizle; Kontrol.Enabled := false; if ((dosya_Adi.Text <> '') and (hash_Adi.Text <> '')) then begin dosya_md5.Text := Form1.Dosya_Hash(dosya_Adi.Text,0); application.ProcessMessages; dosya_sha1.Text := Form1.Dosya_Hash(dosya_Adi.Text,1); application.ProcessMessages; dosya_sha256.Text := Form1.Dosya_Hash(dosya_Adi.Text,2); application.ProcessMessages; dosya_sha384.Text := Form1.Dosya_Hash(dosya_Adi.Text,3); application.ProcessMessages; dosya_sha512.Text := Form1.Dosya_Hash(dosya_Adi.Text,4); application.ProcessMessages; Liste := TStringList.Create; Liste.LoadFromFile(hash_adi.Text); Hash_md5.Text := Trim(Liste.Strings[5]); Hash_sha1.Text := Trim(Liste.Strings[6]); Hash_sha256.Text := Trim(Liste.Strings[7]); Hash_sha384.Text := Trim(Liste.Strings[8]); Hash_sha512.Text := Trim(Liste.Strings[9]); if Dosya_md5.Text = Hash_md5.Text then md5_onay.brush.Color := clLime else md5_onay.brush.Color := clred; if Dosya_sha1.Text = Hash_sha1.Text then sha1_onay.brush.Color := clLime else sha1_onay.brush.Color := clred; if Dosya_sha256.Text = Hash_sha256.Text then sha256_onay.brush.Color := clLime else sha256_onay.brush.Color := clred; if Dosya_sha384.Text = Hash_sha384.Text then sha384_onay.brush.Color := clLime else sha384_onay.brush.Color := clred; if Dosya_sha512.Text = Hash_sha512.Text then sha512_onay.brush.Color := clLime else sha512_onay.brush.Color := clred; Kontrol.Enabled := true; Liste.Free; if ((md5_onay.Brush.Color = clLime) and (sha1_onay.Brush.Color = clLime) and (sha256_onay.Brush.Color = clLime) and (sha384_onay.Brush.Color = clLime) and (sha512_onay.Brush.Color = clLime)) then begin Showmessage('Verilen Hash Bilgisine göre Dosya İçeriği Değiştirilmemiştir.'); end else begin Showmessage('Dosya İçeriği Değiştirilmiştir.Dosya Geçersizdir.'); end; end else begin Showmessage('Dosya ve Hash Dosyasını Seçmelisiniz.'); end; end; end. |
Başka bir yazıda görüşmek üzere
Sercan TEK