מחולל גיבובים
יצירת גיבובי MD5 ו-SHA לכל טקסט, ובדיקה מול checksum צפוי.
מה פונקציית גיבוב באמת עושה
פונקציית גיבוב קריפטוגרפית מקבלת קלט בכל גודל ומייצרת ממנו מחרוזת בתים באורך קבוע — digest, או "גיבוב". תזין לה אות אחת או רומן שלם, ו-MD5 תמיד תחזיר 16 בתים ו-SHA-256 תמיד 32. אותו קלט תמיד מייצר את אותו digest, ושינוי של סיבית בודדת בכל מקום בקלט משנה בערך מחצית מסיביות הפלט — ולכן לשני קבצים כמעט זהים יש גיבובים חסרי כל קשר זה לזה.
התכונה המכרעת היא שהפונקציה רצה לכיוון אחד בלבד. לחשב את הגיבוב של קובץ זה מהיר; לשחזר את הקובץ מתוך הגיבוב זה לא רק איטי אלא בלתי אפשרי עקרונית, משום שפלט באורך קבוע אינו יכול לקודד קלט בלתי חסום. גיבוב הוא טביעת אצבע, לא עותק מוצפן — אין שם שום דבר לפענח.
למה אנשים באמת משתמשים בגיבובים
- אימות הורדות: פרויקט מפרסם את ה-SHA-256 של גרסה, אתה מגבב את הקובץ שקיבלת, וזהות בין ה-digests אומרת שהבתים הגיעו שלמים.
- זיהוי שינוי: מערכות ניהול גרסאות, גיבוי ודה-דופליקציה משוות גיבובים במקום קבצים שלמים, כי להשוות 32 בתים זול בהרבה מלהשוות ג׳יגה-בתים.
- Subresource Integrity: דף אינטרנט מצמיד את גיבוב ה-base64 של סקריפט שהוא טוען מ-CDN, והדפדפן מסרב להריץ את הקובץ אם אין התאמה.
- אחסון סיסמאות — אבל עם פונקציה איטית ייעודית, לעולם לא עם גיבוב רגיל. ראה בהמשך.
שים לב מה משותף לכולם: הגיבוב הוא תחליף קומפקטי למשהו גדול יותר, שמשמש כדי לענות על השאלה "האם זה אותו דבר שציפיתי לו?" בלי לשדר או לאחסן את הדבר עצמו.
MD5 ו-SHA-1 שבורים — מה זה אומר בפועל
פונקציית גיבוב נחשבת שבורה ברגע שאפשר לבנות עבורה התנגשות: שני קלטים שונים שמייצרים את אותו digest. התנגשויות ב-MD5 ניתנות לחישוב על חומרה רגילה מאז 2004, וב-2017 מתקפת SHAttered ייצרה שני קובצי PDF שונים עם גיבוב SHA-1 זהה. שני האלגוריתמים מסומנים בכלי הזה מהסיבה הזאת.
המשמעות המעשית צרה יותר מ"לעולם אל תשתמש בהם". התנגשות אומרת שתוקף ששולט בשני הקבצים יכול לגרום לקובץ זדוני להתאים ל-digest של קובץ תמים, ולכן MD5 ו-SHA-1 כבר לא יכולים להוכיח שקובץ לא זויף בידי גורם עוין. הם עדיין מצוינים לזיהוי שיבוש מקרי — הורדה שנקטעה, סיבית שהתהפכה על דיסק — ותמשיך לפגוש אותם במערכות מדור קודם, בכותרות ETag ובמניפסטים ישנים של חבילות שאיש לא עומד לכתוב מחדש.
כלל האצבע: אם השאלה היא "האם זה ניזוק בדרך?", MD5 מספיק. אם השאלה היא "האם מישהו החליף את זה בכוונה?", השתמש ב-SHA-256 או חזק ממנו.
לעולם אל תגבב סיסמה עם אלה
MD5, SHA-1 ואפילו SHA-256 תוכננו להיות מהירים, ומהירות היא בדיוק התכונה הלא נכונה לאחסון סיסמאות. כרטיס מסך מודרני מחשב מיליארדי גיבובי SHA-256 בשנייה, כך שמסד נתונים גנוב של סיסמאות מגובבות סתם ניתן לתקיפה בקנה מידה עצום — ומכיוון שאותה סיסמה תמיד מייצרת את אותו digest, טבלאות מוכנות מראש מוזילות את זה עוד יותר.
אחסון סיסמאות דורש פונקציה איטית במכוון, ממולחת (salted) ותובענית בזיכרון: Argon2id, scrypt או bcrypt. הן מוסיפות salt אקראי ייחודי לכל סיסמה, כך ששתי סיסמאות זהות לא חולקות digest, והן יקרות בצורה מכוילת, כך שכל ניחוש עולה לתוקף זמן וזיכרון אמיתיים. הכלי הזה נועד ל-checksums ולטביעות אצבע, לא לגיבוב סיסמאות.
לקרוא ולהשוות digests
אפשר לכתוב את אותו digest ביותר מדרך אחת. הקסדצימלי באותיות קטנות הוא מה שכלי שורת הפקודה הסטנדרטיים מדפיסים, וזה בדרך כלל מה שתשווה מולו:
md5sum file.iso # לינוקס sha256sum file.iso # לינוקס shasum -a 256 file.iso # macOS Get-FileHash file.iso -Algorithm SHA256 # PowerShell (מדפיס אותיות גדולות) certutil -hashfile file.iso SHA256 # ווינדוס (מדפיס אותיות גדולות)
לגודל האותיות ב-hex אין שום משמעות — PowerShell ו-certutil מדפיסים אותיות גדולות, כלי יוניקס מדפיסים קטנות, וזה אותו ערך בדיוק. שדה ההשוואה בכלי הזה מתעלם מגודל האותיות ב-hex מהסיבה הזאת. ב-base64 המצב שונה: זהו קידוד צפוף יותר של אותם בתים, שמשמש ב-Subresource Integrity ובחלק מה-APIs, ושם גודל האותיות כן משמעותי — ולכן ההשוואה שם מדויקת.
הרגל אחרון שכדאי לאמץ: לעולם אל תשווה שני digests ארוכים בעין כדי להחליט אם הם זהים. העין האנושית טובה מאוד בלראות את מה שהיא מצפה לראות, והעובדה שכמה תווים בהתחלה ובסוף תואמים לא אומרת דבר. הדבק את הערך הצפוי ותן להשוואה להיות מדויקת.
שאלות נפוצות
- האם הטקסט שלי נשלח לשרת?
- לא. כל digest מחושב בדפדפן שלך — משפחת ה-SHA דרך Web Crypto API וה-MD5 דרך ג׳אווהסקריפט שרץ על המכונה שלך. שום דבר שתקליד לא עוזב את המכשיר.
- אפשר להפוך גיבוב בחזרה לטקסט המקורי?
- לא. גיבוב הוא טביעת אצבע באורך קבוע, לא עותק מוצפן, ואי אפשר לשחזר ממנו את המקור. אתרים שמפרסמים "פענוח MD5" פשוט מחפשים את הגיבוב שלך בטבלה של קלטים נפוצים שחושבו מראש, וזה עובד רק על טקסט קצר או צפוי.
- למה MD5 ו-SHA-1 מסומנים כאן באזהרה?
- מפני שהתנגשויות מעשיות בשניהם: אפשר לבנות שני קלטים שונים שחולקים digest. זה הופך אותם לבלתי מתאימים להוכחה שקובץ לא זויף בכוונה, אף שהם עדיין מצוינים לתפיסת שיבוש מקרי.
- באיזה אלגוריתם כדאי להשתמש?
- SHA-256 הוא ברירת המחדל ההגיונית וזה מה שרוב הפרויקטים מפרסמים כיום. SHA-512 אינו מאובטח יותר באופן משמעותי למטרה הזאת, אבל הוא מהיר יותר על חומרת 64 סיביות. השתמש ב-MD5 או ב-SHA-1 רק כשמשהו שאינו בשליטתך כבר דורש אותם.
- אפשר לגבב סיסמה עם זה?
- אפשר, אבל אין לאחסן את התוצאה. אחסון סיסמאות דורש פונקציה איטית וממולחת כמו Argon2id, scrypt או bcrypt — גיבובים מהירים כמו אלה הם בדיוק מה שהופך מסדי נתונים גנובים של סיסמאות לקלים לפיצוח.
- למה הגיבובים משתנים כשאני מוסיף רווח או שורה חדשה?
- מפני שרווחים הם חלק מהקלט. שורה חדשה בסוף היא הסיבה הנפוצה ביותר לכך שגיבוב לא תואם למה שציפית — טקסט שהועתק מטרמינל או מעורך נושא איתו לעיתים קרובות שורה כזאת שאינך רואה.
- האם הוא מטפל נכון בעברית, בערבית ובאמוג׳י?
- כן. הטקסט מקודד לבתים ב-UTF-8 לפני הגיבוב, וזה התקן שכל כלי אחר משתמש בו — כך שגיבוב "שלום" או אמוג׳י כאן ייתן בדיוק את אותו digest כמו md5sum או sha256sum על קובץ UTF-8 עם אותם תווים.
- למה הוא מגבב טקסט אבל לא קבצים?
- ל-Web Crypto אין API של הזרמה, ולכן קובץ חייב להיקרא לזיכרון במלואו לפני שאפשר לגבב אותו, וה-MD5 שנכתב ביד היה איטי במידה מורגשת על קובץ גדול. גיבוב טקסט מכסה את המקרה הנפוץ ביושר, במקום להציע גיבוב קבצים שתוקע את העמוד.