php / המדריך לקידוד מידע / קידוד חד-צדדי- ו-HASH
שיעור 2
קידוד חד-צדדי- ו-HASH
"קידוד חד צדדי? מה הקטע"? אתם בטח שואלים את עצמכם . ובכן, אי היכולת
לפענח משהו היא דבר נחוץ לפעמים. כאשר אתה יוצר hashes אתה יוצר מבנה
דיגיטלי של מחרוזת או קובץ. אתה לא מקודד את הקובץ, לכן אתה לא יכול לפענח
אותו. ברוב המערכות הסיסמאות מוצפנות בצורה שכזו, גם אם יחדור פורץ כלשהו
וימצא את הקובץ בו נמצאות הסיסמאות, כל מה שיהיה בידו זה רשימה של סימנים
מוזרים ונטולי משמעות, וחשוב מזה, בלתי אפשריים לשחזור.
ההסבר הזה מעלה את השאלה הבאה: "איך המחשב יכול לפענח את הסיסמא שלי
אם אני הקלדתי "בננה" ובקובץ הסיסמאות מופיע "עיחליGFY5"? זה פשוט
(סופסוף הסבר פשוט!): כאשר אתה מקליד סיסמא המערכת מצפינה את הקלט
ומאחסנת את הצופן בקובץ הסיסמאות. בכל פעם שבה אתה נכנס למערכת, היא
מצפינה את הסיסמא באותה שיטה ובודקת אם הצופן זהה לזה שנמצא בקובץ
הסיסמאות. ליותר מידע על הצפנה מסוג זה כדאי לקרוא: מהי פונקצית .Hash
הצפנות כאלו משמשות לא רק לבדיקת סיסמאות, אלא גם לבדיקת אמינות
מסמכים, כלומר, אם הם שונו או לא. אם יש לך מחרוזת שמכילה את הערך
"1000" והיא שונתה ל-"1001" הקובץ המוצפן יראה אחרת לגמרי.
ל-PHP יש פונקצית הצפנה מוכנה מראש, ()md5 .
אבל אם תוריד ותתקין את ספרית
mhash מתוך http://sasweb.de/mhash
ותקמפל את PHP בעזרת אופציית with-mhash-- ואז תוכל להשתמש בדרכי
הצפנה נוספות כגון SHA1, HAVAL, TIGER, GOST ועוד. כאשר מקמפלים
את PHP עם with-mhash--,התוצאה תכלול את הפונקציות הבאות:
|
mhash - מחשבת את צופן המחרוזת או הקובץ.
|
|
mhash_get_block_size - מחשבת את גודל הבלוק של הצופן שהתקבל.
|
|
mhash_get_hash_name - מספקת את השם המלא שניתן לצופן.
|
הסבר נרחב ומקיף על הפונקציות הללו תוכלו למצוא במדריכי PHP השונים.
תהליך ההתקנה של ספרית mhash הוא כדלקמן:
- הורד את הקובץ *.tar.gz
- gunzip את the *.gz.
- tar -xvf the *.tar file
- cd mhash*
- ./configure --disable-pthreads
- make
- make install
שים לב: הדגל "disable-pthreads--" הוא המפתח שגורם לאפאצ'י, PHP,
וספרית mhash לעבוד כמו שצריך. אם אתה חושש שמשהו לא מסתדר
במהלך ההתקנה, תבדוק בארכיון רשימות הדואר של PHP.
הקוד הבא מראה כיצד להשתמש בפונקצית mhash. אני מתכוננת ליצור צופן
לפסקא הרביעית במאמר הטקסט מתחיל ב- "Hashes are used only…" (כמה סודי).
דבר ראשון, עלינו לשים את התוכן של המחרוזת או הקובץ בתוך משתנה.
קראתי לשלי to_hash $ מכיוון שאני כל כך יצירתית ובעלת דמיון מפותח:
$to_hash = "Hashes are used not only in password-matching situations, but also to ensure that the integrity of a file has not become compromised,
meaning it hasn't changed in any way.If you have a file that contains the
string \"10000\and the string changes to \"10001,\" the resulting hash will
be very different.";
שימו לב להשמיט מירכאות ושאר סימנים מוזרים הנמצאים במחרוזת או בקובץ!
אחר כך, צרו משתנה שיכיל את שם ההצפנה. אני משתמשת ב MHASH_TIGER
בדוגמא הספציפית הזו:
$hash_to_use = MHASH_TIGER ;
עכשיו ניצור את הצופן, ע"י השמת הפלט שיתקבל מ ( ) mahsh בתוך משתנה.
אני השתמשתי ב hash_of_string $ כשם המשתנה שלי. פונקצית () mhash נשענת
על שני ביטויים: הצופן שבו היא צריכה להשתמש, והקובץ שאותו עליה להצפין.
$hash_of_string = mhash($hash_to_use, $to_hash);
חושב שזה הכל, נכון? שרק תקבל חזרה את הערך של hash_of_string$ וסיימת?
אז לא. צופנים הם בינאריים, מה שאומר שהחומר בתוך hash_of_string$ מורכב
ממידע בינארי. אם תנסה להשתמש בזה כל מה שתראה זה רצף של סימנים משונים
שיפיק הדפדפן שלך בניסיון נואש להראות מידע בינארי. במקום הגועל הנפש הזה,
עליך להשתמש בפונקצית ()bin2hex שהופכת מידע בינארי להקסדצימלי:
echo "<p>The hash of that big paragraph is " . bin2hex($hash_of_string) . "</p>";
לסיום, עוד קצת מידע, רק כדי שתוכל לראות איך ()mhash_get_hash_name
ו ()mhash_get_block_size עובדות:
$hash_name = mhash_get_hash_name($hash_to_use);
$hash_block_size = mhash_get_block_size($hash_to_use);
echo "<p>Hash Name: $hash_name</p>";
echo "<p>Hash Block Size: $hash_block_size</p>";
אז מהתחלה עד כאן, הנה סקריפט פשוט של mhash
<?
$to_hash = "Hashes are used not only in password-matching
situations, but also to ensure that the integrity of a
file has not become compromised, meaning it hasn't changed
in any way. If you have a file that contains the string
\"10000\" and the string changes to \"10001,\" the resulting
hash will be very different.";
$hash_to_use = MHASH_TIGER;
$hash_of_string = mhash($hash_to_use, $to_hash);
echo "<p>The hash of that big paragraph is " .
bin2hex($hash_of_string) . "</p>";
$hash_name = mhash_get_hash_name($hash_to_use);
$hash_block_size = mhash_get_block_size($hash_to_use);
echo "<p>Hash Name: $hash_name</p>";
echo "<p>Hash Block Size: $hash_block_size</p>";
?>
התוצאה שתתקבל מהסקריפט המסוים הזה היא:
The hash of that big paragraph is
582cc28f78c2d87c4d6c9b16978d31c80b8e0d6fd87d61f2
Hash Name: TIGER
Hash Block Size: 24
כיף, נכון? עכשיו נסה לנחש מה יקרה אם אני אשנה את הערך שבתוך to_hash$ ?
נניח שאשנה את המספרים ל"55555" ו"99999".
הצופן החדש יהיה dcdcaa1b6dc4e7b0ec3121aae7acc29d530267f1fa949e, 93
שונה בתכלית מהצופן האורגינלי, וכל מה שאני עשיתי זה לשנות שני מספרים!
כמובן שפונקציות הצפנה מאוד יעילות כאשר צריך לגלות אם קובץ שונה או לא!
עמוד הבא: השימוש בפונקצית ()crypt >>
|