PDA

View Full Version : مقاله: گرفتن Hash Code از یک فایل با استفاده از الگوریتم SHA1



BORHAN TEC
سه شنبه 24 اسفند 1389, 20:57 عصر
سلام
آیا تا به حال فکر کرده اید با وجود چند میلیون ویروس کامپیوتری که یک آنتی ویروس می تواند شناسایی کند چرا حجم دیتابیس آن از چند مگابایت تجاوز نمی کند؟
بله، این شرکت ها فایل ویروس را در دیتابیس برنامه قرار نمی دهند. بلکه از آن یک امضا و یا signature
تهیه می کنند و آن را در دیتابیس قرار میدهند . در واقع کلید این روش در الگوریتم های Hashing نهفته است. الگوریتم های Hashing انواع مختلفی دارد مثل CRC32، MD5 و SHA1. در این میان یکی از موفق ترین این الگوریتم ها، الگوریتم 160 بیتی Sha1 است. شما به راحتی با استفاده از کد زیر می توانید یک امضا از یک فایل با استفاده از الگوریتم SHa1 تهیه کنید. قبل از انجام این کار یونیتهای زیر را به برنامه اضافه کنید. توجه داشته باشید که این یونیتها به صورت اتوماتیک به همراه C++ Builder بر روی سیستم قرار می گیرند. این یونیت ها قسمتی از Indy 10 هستند.
#include <idHash.hpp>
#include <idHashSha.hpp>
بعد از انجام این کار تابع زیر را بنویسید.
String __fastcall SHA1(const String fileName) {
String result;
TIdHashSHA1 *idSHA1 = new TIdHashSHA1();
TFileStream *fs = new TFileStream(fileName, fmOpenRead || fmShareDenyWrite);

try {
result = idSHA1->HashStreamAsHex(fs);
}
__finally {
delete fs;
delete idSHA1;
}
return result;
}
در زیر هم یک مثال نمونه از نحوه به کار گیری تابع نوشته شده را می توانید ببینید، که به صورت یک برنامه کامل قابل مشاهده است.
// ---------------------------------------------------------------------------

#include <vcl.h>
#include <idHash.hpp>
#include <idHashSha.hpp>
#pragma hdrstop

#include "Unit2.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;

// ---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) {
}

// ---------------------------------------------------------------------------
String __fastcall SHA1(const String fileName) {
String result;
TIdHashSHA1 *idSHA1 = new TIdHashSHA1();
TFileStream *fs = new TFileStream(fileName, fmOpenRead || fmShareDenyWrite);

try {
result = idSHA1->HashStreamAsHex(fs);
}
__finally {
delete fs;
delete idSHA1;
}
return result;
}

// ---------------------------------------------------------------------------
void __fastcall TForm2::BitBtn1Click(TObject *Sender) {
ShowMessage(SHA1("c:\\1.gif"));
}
// ---------------------------------------------------------------------------
توجه داشته باشید که این الگوریتم ها کاربرد بسیار بیشتری دارند. به عنوان مثال همیشه بهتر است که در دیتابیس ها به جای قرار گیری کلمه عبور، از آن کلمه عبور یک HashCode بگیریم و آن Hash Code را در دیتابیس ذخیره کنیم. که این کار می تواند امنیت را به نحو چشمگیری افزایش دهد. برای این کار شما به جای یک فایل باید از یک رشته HashCode بگیرید. حال شما به جای تابع بالا باید از کد زیر برای گرفتن Hash Code با روش Sha1 از یک رشته استفاده کنید:
String __fastcall SHA1(const String myText) {
String result;
TIdHashSHA1 *idSHA1 = new TIdHashSHA1();

try {
result = idSHA1->HashStringAsHex(myText);
}
__finally {
delete idSHA1;
}
return result;
}
حالا موقعی که کاربر رمز عبور را وارد می کند ابتدا باید از رمز عبور وارد شده یک هش کد بگیرید وسپس مقدار آن را در دیتابیس جستجو کنید و ببینید که چنین مقداری وجود دارد یا نه. اگر این مقدار موجود بود مشخص می شود که رمز عبور وارد شده معتبر است.

مثال: اگر با استفاده از الگوریتم Sha1 از رشته ShuhinAshayeri یک هش کد بگیریم مقدار زیر بدست می آید:
F402A8B8267FED220342AC5F09558D4C27897D4E
موفق باشید...:قلب: