Hash
Hash, או בתרגום חופשי – ערך מספרי יחודי למידע, נותן חתימה יחודית לכל מידע. הסבר- כתבתי מכתב, קיבלתי את ערך ה Hash שלו שהוא לדוגמא 1b1e2cca18d2beec33272ea8b3f4c271, אז תיאורטית (כן, רק תיאורטית...) , שום מכתב או מידע בעולם לא יתן לי את אותו הערך מלבד אותו המכתב, מה שגם אומר שאם מישהו ישנה אפילו אות אחת במכתב, אז ערך ה Hash  ישתנה.

למה זה טוב? אז קודם כל כבר מהדוגמא ניתן לראות שככה אפשר לבדוק אם מידע כלשהו שיצרתי, השתנה על ידי מישהו בדרך.

שימוש נפוץ מאוד הוא לשמירת סיסמאות בדטה בייס. במקום לשמור את הסיסמא של המשתמש כמו שהיא, ואז אם מישהו יצליח איכשהו לפרוץ לדטה בייס הוא יראה את כל הסיסמאות ויוכל להשתמש בחשבונות של אנשים עד סוף החיים, אני שם את ערך ה Hash של הסיסמאות, וכשמישהו מנסה לעשות לוגין למערכת, אני עושה Hash  על הסיסמא שהוא סיפק ומשווה לזאת שבדטה בייס. דרך אגב, זוהי תכונה/דרישה נוספת של Hash  - שלא ניתן יהיה באמצעות ערך ה Hash לשחזר את המידע המקורי שנתן את הערך הזה, כך שאם מישהו רואה את ערך ה Hash  של סיסמא בדטה בייס, הוא לא יכול למצוא מה היתה הסיסמא המקורית (גם בתיאוריה... ישנם הרבה כגון kmd5 ו- john the ripper  לשיחזור סיסמאות מ Hash ). למידע תיאורטי נוסף

אז איך משתמשים? פשוט ביותר, בוחרים אלגוריתם Hash. דוט נט מציעה מספר אלגוריתם כגון SHA1,SHA256,SHA512,MD5,HMACSHA1,MAC3DES ועוד כמה ששונים בעיקר בחוזק האלגוריתם (ככל שהוא יותר חזק כך יש יותר סיכויים שהוא ישמור על יחודיות הערך ועל קושי שיחזור המידע המקורי)

כל האלגוריתם יורשים ממחלקה אחת:

 

//using System.Security.Cryptography;

 

HashAlgorithm myhash = null;

נבחר את MD5 שהוא הסטנדרט בהרבה ארגונים:

 

myhash = new MD5CryptoServiceProvider();

ניתן לו את המידע שאנחנו רוצים לחשב עבורו את הערך:

string mydata=”shalom”;

byte[] data=Encoding.UTF8.GetBytes(mydata);

myhash.ComputeHash(data);

נמשוך את התוצאה :

 

byte[] result=hash.Hash;

ניתן להפוך לסטרינג כמובן:

 

String strResult=Convert.ToBase64String(result);

שני סוגי ה Hash האחרונים שהצגתי שונים מעט. הם יוצרים Hash  למידע אך מוסיפים גם סיסמא, מה שאומר שאם מישהו אחר יקבל את המידע ויעשה עליו Hash, הוא לא יקבל את אותה תוצאה אם אין לו את הסיסמא, כך שניתן לשלוח למישהו מידע עם ערך ה  Hash ובהנחה שהצד השני יודע את הסיסמא, הוא יוכל לבדוק אם המידע במכתב לא שונה בדרך.

השימוש די זהה, ההבדל היחיד הוא שביצירת האובייקט אנחנו נותנים לו את הסיסמא גם :

 

byte[] key=Encoding.UTF8.GetBytes(“my password”);

myhash = new HMACSHA1(key);

* אם משתמשים באלגוריתם השני שמאפשר סיסמא - MACTripleDES

 יש לשים לב שאורך הסיסמא אמור להיות בגדלים קבועים של 8, 16 או 24 בתים

וממשיכים כרגיל.

 

 

טוען נתונים...
אהבתם?
המליצו לאחרים!

נהניתם? בעיות? הערות?
אני רוצה לשמוע!
rss feed