0.5 קריפטו בסיסי הרצאה
**# קריפטוגרפיה: מושגי יסוד לפני תחילת הקורס
המטרה של הרצאה זו היא ליישר קו בכל מה שנוגע לקריפטוגרפיה לפני תחילת הקורס. נסקור את המושגים המרכזיים: קידוד, עירבול, הצפנה סימטרית וא-סימטרית, ושימוש בsalt.
קידוד: base64¶
מה זה קידוד?
קידוד הוא תהליך המרה של מידע מפורמט אחד לאחר, מבלי להסתיר את תוכנו. זהו לא תהליך הצפנה, מאחר שניתן לשחזר את המידע המקורי ללא צורך במפתח.
מהו base64?
שיטת Base64 הוא שיטת קידוד שמאפשרת לייצג נתונים בינאריים (כמו קובצי תמונה, טקסטים מוצפנים וכו') בתור טקסט קריא שמורכב מ-64 תווים בלבד: אותיות לטיניות (גדולות וקטנות), ספרות, ועוד שני תווים (+ ו-/).
דוגמה¶
נניח שיש לנו את הטקסט:
בקידוד Base64, הוא ייראה כך:
מתי משתמשים ב-base64?¶
-
העברת נתונים בפורמטים שלא תומכים בבינארי, כמו JSON או URL.
-
אחסון נתונים בבסיסי נתונים טקסטואליים.
בלינוקס כדי לקודד משהו לbase64 הריצו:
בלינוקס כדי לפענח קידוד של base64 הריצו
עירבול - hash¶
מהו עירבול (Hashing)?
עירבול הוא תהליך חד-כיווני שבו פונקציה מתמטית ממירה קלט (למשל סיסמה) למחרוזת קבועת-אורך ייחודית. לא ניתן להחזיר את הערך המעורבל לצורתו המקורית.
דוגמאות לאלגוריתמים נפוצים:
-
MD5 – מיושן וחשוף להתקפות.
-
SHA-1 – חלש כיום, אך עדיין קיים במערכות ישנות.
-
SHA-256 – חלק ממשפחת SHA-2 ונחשב בטוח לשימוש.
-
bcrypt, scrypt, Argon2 – פונקציות עירבול חזקות במיוחד לשמירת סיסמאות.
דוגמה לשימוש ב-SHA-256¶
import hashlib
text = "password123"
hashed = hashlib.sha256(text.encode()).hexdigest()
print(hashed)
מתי משתמשים בעירבול?
-
שמירת סיסמאות בבסיסי נתונים.
-
ביצוע Checksum לקבצים.
-
חתימות דיגיטליות.
אחרי שאנחנו עושים hash למידע מסויים, המידע יהיה מוערבל ולא ברור, ולא תוכלו להחזיר אותו למצבו הקודם.
הצפנה סימטרית¶
מהי הצפנה סימטרית?
הצפנה שבה משתמשים באותו מפתח הן להצפנה והן לפענוח. יש צורך לשמור את המפתח בסוד.
אלגוריתמים נפוצים:
-
AES (Advanced Encryption Standard) – תקן הצפנה מודרני וחזק.
-
DES (Data Encryption Standard) – מיושן ונחשב לא בטוח.
-
RC4 – זרם הצפנה ששימש בעבר בפרוטוקולי רשת כמו WEP, אך אינו מומלץ כיום.
דוגמה להצפנה עם AES¶
from Crypto.Cipher import AES
import os
key = os.urandom(16) # מפתח באורך 128 ביט
cipher = AES.new(key, AES.MODE_EAX)
ciphertext, tag = cipher.encrypt_and_digest(b"Secret Message")
יתרונות:
-
מהירה ויעילה.
-
טובה להצפנת מידע רב.
חסרונות:
- דורשת שיתוף מפתח באופן מאובטח.
אחרי שהשגתם מידע מוצפן סימטרית, תוכלו לנסות לנחש או להשיג את המפתח כדי לפענח את המידע.
הצפנה א-סימטרית¶
מהי הצפנה א-סימטרית?
הצפנה שמשתמשת בשני מפתחות – מפתח ציבורי להצפנה ומפתח פרטי לפענוח.
אלגוריתמים נפוצים:
-
RSA – אחת מהשיטות הנפוצות ביותר.
-
ECC (Elliptic Curve Cryptography) – שיטה מודרנית ויעילה יותר.
-
Diffie-Hellman – משמש בעיקר להחלפת מפתחות.
דוגמה להצפנה עם RSA (Python)¶
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
key = RSA.generate(2048)
cipher = PKCS1_OAEP.new(key)ג
ciphertext = cipher.encrypt(b"Hello")
יתרונות:
-
אין צורך לשתף מפתח סודי מראש.
-
משמש לאימות משתמשים וחתימות דיגיטליות.
חסרונות:
-
איטי יותר מהצפנה סימטרית.
-
דורש יותר משאבי חישוב.
איך לשבור Hash עם John the Ripper¶
הכלי John the Ripper הוא כלי פופולרי לשבירת סיסמאות (password cracking) שמסוגל לשבור hashes באמצעות מספר שיטות:
שלבים בסיסיים:¶
-
התקנה (אם עדיין לא מותקן):
-
שמירת ה-Hash בקובץ
יצירת קובץ (למשלhash.txt) עם ה-hash שרוצים לשבור, בפורמט מתאים (למשלuser:hashאו רק ה-hash עצמו). -
הפעלת John the Ripper
- הדגל
--format– מציין את סוג ה-hash (למשלmd5,sha256,bcryptוכו'). - אפשר להוסיף מילון (
--wordlist=FILE) או מצב brute-force (--incremental).
שיטות תקיפה נפוצות:¶
- מילון (Dictionary Attack)
- Brute-Force
- שימוש ב-Rules (שינויים אוטומטיים כמו הוספת מספרים למילים)
הwordlist המוכר ביותר הוא "rockyou.txt", השתמשו בו כשאתם מנסים לשבור סיסמה עם Dictionary Attack:
הורידו אותו באמצעות
דוגמה: שבירת MD5¶
אם יש לך hash כמו 5f4dcc3b5aa765d61d8327deb882cf99 (הסיסמה היא password):
1. שמור אותו ב-hash.txt.
2. הפעל:
3. אם הצליח, התוצאה תוצג עם:
הערות חשובות:¶
- הכלי John תומך בעשרות פורמטים (למשל NTLM, LM, bcrypt).
- ביצועים תלויים בכוח המעבד/כרטיס המסך.
מתקפת Rainbow Tables (טבלאות קשת)¶
בגלל שבdictionary attack אנחנו צריכים לחשב את הhash של כל הסיסמאות בwordlist שלנו (למשל בjohn the ripper)- לשבור hash בצורה הזו יקח הרבה זמן.
הRainbow Tables הן מבני נתונים המכילים חישובים מוכנים מראש של פונקציות hash עבור סיסמאות נפוצות. הטבלאות מאפשרות הפיכת hash לסיסמה המקורית בצורה מהירה.
איך זה עובד?
1. התוקף מייצר (או מוריד) טבלה המכילה זוגות של סיסמאות וה-hashes שלהן. (rainbow table)
2. כאשר הוא רוצה לשבור hash, הוא משווה את ה-hash לטבלה כדי למצוא את הסיסמה המקורית.
3. זה חוסך זמן חישוב רב, במיוחד עבור סיסמאות פשוטות.
דוגמה:
אם ה-hash של הסיסמה 123456 הוא e10adc3949ba59abbe56e057f20f883e, התוקף יכול לחפש בטבלה ולמצוא את ההתאמה במהירות.
מלח- Salt, הגנה מפני Rainbow Tables¶
מלח, או Salt הוא ערך אקראי המוסף לסיסמה לפני ה-hashing, כדי להפוך אותה לייחודית גם אם הסיסמה עצמה נפוצה.
איך Salt מונע התקפת Rainbow Tables?
1. מבטל שימוש בטבלאות מוכנות מראש – כי כל hash תלוי ב-Salt ייחודי, ולא רק בסיסמה.
2. מאלץ חישוב מחדש לכל סיסמה – גם אם שתי משתמשים בוחרים את אותה סיסמה, ה-hash יהיה שונה כי ה-Salt שונה.
3. מאט התקפות brute-force – התוקף לא יכול להשתמש ב-hashes ידועים מראש, אלא צריך לתקוף כל hash בנפרד.
דוגמה:
- ללא Salt:
hash("123456") = e10adc3949ba59abbe56e057f20f883e (נמצא בטבלת קשת).
- עם Salt:
hash("123456" + "a1B3fK") = 7f3d7a... (לא קיים בטבלה, כי ה-Salt אקראי).
יישום נכון של Salt:
- יש לייצר Salt אקראי וייחודי לכל משתמש.
- לאחסן את ה-Salt לצד ה-hash (לא סודי, אך חיוני לאימות).
- להשתמש בפונקציות hash איטיות (כמו bcrypt או Argon2) כדי להקשות עוד יותר על התקפות.
טיפ:
- קראו על john בצורה יותר מעמיקה וגם על הכלי hashcat המתחרה שלו.
עברו על הכלי cyberchef, הוא מאוד שימושי בעבודה עם תוכן מוצפן או מקודד.