יש אי הבנה נפוצה, שהאמין כי Hash וההצפנה הם דבר אחד. הם לא. האש הוא בלתי הפיך. קח את הדוגמה הבאה כדוגמה:
$ Echo-n Password123 | md5sum
42f749ade7f9e195bf475f37a44cafcb-
{
}
אנו מעבירים את המחרוזת "Password123" לאלגוריתם MD5 (algo), אשר מבצעת פעולות מתמטיות ומחזירה. הדרך היחידה להשיג את אותו ערך פלט hash היא להזין את algo את הקלט המקורי. יש סכסוכים, אבל נוכל לדון בזה מאוחר יותר.
רוב אלגוריתמים ההאש מפוצקים מחרוזת בינארית באורך קבוע של קידוד hexadesimal. אחרים, כמו דוגמה זו, משתמשים במחרוזת מקודדת base64 כפלט. שים לב שהאורך הוא תמיד זהה:
{SHA} uNF8eZRJ8jmr8WTjyocRJPVpe7w=
{SHA} lqdu/Zr6o2dgIER8Up1/7lcUtgw=
{SHA} qYUOwLMlDEuukA5HCT4LR1kQzco=
{SHA} mxzbcpywj7tts1w2w2kggjslwtg=
{
} { 1000L} {2saplauh9mz019}
ד"ר
אני לא רוצה לדבר יותר מדי על הצפנה (כי הדברים האלה הם עבור ספר), אבל חשוב להיות מסוגל להבחין בין מחרוזת האש מחרוזת הצפנה מחרוזת הצפנה. ההצפנה ממלאת בדרך כלל מחרוזת העומדת באורך מסוים לפני שההצפנה מתרחשת. זה גם דורש מפתח (או סיסמה) לפענוח. אם אתה משתמש בסיסמה הצפנה, מחרוזת תשתנה בהתאם לאורך הקלט. אם אתה רואה ערימה של סיסמאות קריפטקסט שאורכים שונים, אולי אתה עובד בהצפנה במקום חש. דוגמאות AES-256-CBC מחרוזת הצפנה וטקסט רגיל קשור (המפתח הוא "ASDF"):
foobar { } } u2fsdgtvkx19g+ J6TNHDNHDNHDgtnHDNHDNHDNHDNHDNHDNU
foobarfoobar | U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog=
foobarfoobarfoobar | U2FsdGVkX1 / EOnUt57TCW4Rh0EdNnWX + lDatuQv2xEXXeAeowW0XG / EXJUe9aSUz
$ cat encrypted_passwords
U2FsdGVkX19G+KtytNHdj6yH2AVvX26pEmtunS/PRnU=
U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog=
U2FsdGVkX1/EONUT57TCW4RH0EDNWX+lDatuQv2xEXXeAeowW0XG/EXJUe9aSUz
$ עבור i in `cat encrypted_passwords`; do echo $ i | openssl enc -base64 -d -aes-256-cbc - pass pass: asdf; echo; צורך
פובאר
foobarfoobar
foobarfoobarfoobar עכשיו אתה יכול לחשוב: אולי אתה צודק. עם זאת, חומרים קריטיים חייבים להיות זמינים למערכת, מה שאומר שהיא בעצם סיסמה מאסטר טקסט פשוט ממוקמת במקום כלשהו - בין אם כמפתח RSA או סיסמה או בקובץ, מוטבע במסד נתונים, קודד קשה ביישום או סיסמה במקום כלשהו בזיכרון. pfft, לא one ' s משתמש asdf כהמפתח למשתמשים their ' passwords
השתמש באותה מחרוזת של MD5:
foobar { } { } | 3858f62230ac3c915f300c664312c63f
foobarfoobar | 59faa421729e846dd800dce59943bfc0
foobarfoobarfoobar | 1352aadab322d1a033c27964be0965dbסיסמת האש רחוק מלהיות מושלמת למעשה היא קצת גרועה, אבל היא גרועה יותר מאשר ההצפנה בגלל מה היא מנסה להשיג. משתמשים בוחרים בדרישות המינימליות המוחלטות בתדירות גבוהה יותר מאשר not ויכולים להשתמש בו גם במספר אתרים. "hacks" רבים הם למעשה רק התקפות שימוש חוזר באישורים. אם הפשרה הראשונית היא להשתמש בהצפנה, אז המאמץ היחיד שהתוקף צריך לעשות הוא למצוא את המפתח המפענח את כל הסיסמאות. עבור האש, הם צריכים לפחות לעבוד קשה כדי לפצח אותם. כאשר משמש עם אלגוריתמים מודרניים כמו sha512crypt, bcrypt, scrypt או argon2, חש עשוי לדרש מאמץ רב כדי לפצח אותו.
הוספת מלח היא הוספת מחרוזת לסיסמה לפני hash. המלח של כל חש צריך להיות ייחודי, בדרך כלל נבחר באופן אקראי, מכיוון שהנקודה היא להפוך את אותו טקסט פשוטי "מעבר" ערך שונה בכל פעם. זה מקשה על חייהם של crack cryptographic כי על מנת לבדוק את המילה "סיסמה" עבור כל אחד מ1,000 משתמשים, לכל משתמש יש SALT ייחודי, והם חייבים לעשות את זה 1,000 פעמים - למשתמש/מלח פעם אחת. משמעות הדבר גם היא שהם לא יכולים להשתמש ביעילות במילונים שנערך מראש או בטבלאות rainbow (בדרך כלל...) מכיוון שהם דורשים כל מלח מותאם אישית.
אתר האינטרנט לפעמים בלבש את זה ומשתמש במלח אוניברסלי עבור כל המשתמשים; זה מנוגד למטרה.
להלן הוא SHA1 המלוח:
B353977827F67A4AE0318F3A947FAE1C13D990:b8d18ca
|___________________________________________|
hash { } {100025} { } {100027} { } {100027} {100028} {100028} {100027} {100028} {100027} {100027} {100028} {100028} {100027} {100027} {100028} {100028} {100027} {100028} {100027} {100028} {100028} {100027} {
|
{ } { } { } { } { } { } Ming {1001107} { } {100112} {1001107} {1001107} {1001107} {1001107} 107 {1001107} {100111} 107} 108 {1001107} {100111 {1001108 {1001107} {1001107} 107} 107 {1001108 {1001108 {1001107 {1001107 {100111 107 {100111} 107} {1001107} {100111 {1001108 {1001108 { ערך המלח שלו הוא "b8d18ca" ומשתמש ב-API של SHA1 ($salt.$pass). משמעות הדבר היא שהאלגוריתם מקבל את הטקסט הפשוי של password, מייצר salt ומוסיף אותו לפני הטקסט הפשוי. כאשר אתר או אפליקציה מנסה לאמת את הסיסמה שלך בעתיד, הוא ישתמש בסיסמה הטקסט הפלוי שלך כקלט, יקרא את ערך salt ב-Hash המאוחסן, להוסיף אותה לפני הסיסמה שבוחרת, וישווה את הערך הח'ש שנוצר עם הערך הח'ש המאוחסן. Crack אם לא יודע שחלק מזה הוא מלח, ההאש ייצר את הטקסט הפשוט הבא: b8d18capassword
מכיוון שהאלגוריתם עושה קלט טקסט רגיל, salt והח'ש שנוצר ניתן לשמור ולשקוף למשתמש. כאשר פיצוח, אם האלגוריתם הוא מלח, אנחנו צריכים לדעת את המלח כדי שנוכל לספק אותו בעת יצירת plaintext המועמד.
אם מיושם כראוי, המלח יהפוך את הסדק לצרוך זמן יותר. באמצעות מלח אקראי, אתה מאלץ את קרקר לבזבז זמן בניסיון לפצח את האש שאינו תואם את סלט. זה משמש בערך את המאמצים הנדרשים עבור device_speed/number_of_salts מכיוון שאנחנו צריכים ליצור מועמד לכל מלח. אם המלח הוא סטטי, אז הפעולה המתמטית זהה... speed_of_device/1. דרך נוספת לצפות זו:
Our GTX 980 cracks SHA1 ($salt.$pass) 3576.8 MH / s or per billion
Our hashlist contains 1000 unique salts
3,500,000,000 / 1000 = 3,500,000 candidates per second
זה איטי בשלושה סדר גודל, הפסד של 99.9%. כאשר משתמשים במלח סטטי, זה נראה כזה:
שלנו GTX 980 cracks SHA1 ($ salt.$ pass) at 3576.8 MH / s or billion candidates per second
Our hashlist contains 1 unique salt
3,500,000,000 / 1 = 3,500,000,000 candidates per second
אם זה אין משמעות, נא להמשיך לקרוא, יהיה לנו תרשים יפה מאוחר יותר...
plax
{} ניתן להשתמש בקוד אחד. גיטים אחרים. לאחר מכן הופך אותו להגדרת בחלק מהחש עצמו. לדוגמה, md5crypt () משתמש ב-MD5, כולל salt, ומחזור בדיוק 1,000 פעמים. sha512crypt () משתמש ב-sha512, כולל מלח ומחזור מספר פעמים ניתנים להגדרת (ברירת מחדל הוא 5,000).
האיטרציה משפיעה בעיקר על עלות מחזור החישוב של אלגוריתם ההאש, ולא לצריכת הזיכרון שלה או גורמים אחרים. אלו גם התקפות חשובות כאשר עיצוב אופטימיזציה להתנגד סוגים מסוימים של סוגים חש, אבל זה עשבים מדי כדי לדון כאן.
השפעת סוג האש על מהירות הפיצוח
בואו נסתכל על כמה דוגמאות להדגים את ההשפעה של בחירת אלגוריתם האש, בין אם מדובר במכירה, שימוש במספר איטרציות וכו'. נניח שהתוקף אסף חש של 1,000 משתמשים מאתר נגוע, הם רק רוצים לבצע התקפה פשוטה לבדוק את חש של כל סיסמה - 143 מיליון סיסמאות מועמדים.
סוג האש המשמש על ידי אתר נגוע תהיה השפעה עצומה על הזמן הנדרש. תוקף עובר בהתקפה זו. זהו תרשים (יחסית, בערך) של כמה זה לוקח שניות להשלים את ההתקפה, בהתאם לסוג ההאש המשמש, שבו כרטיס גרפי סטנדרטי:
ובכן, זה חסר תועלת! סוג ההאש החזק ביותר הוא הרבה יותר איטי, אבל מהר יותר. הסוג פשוט מריץ עד שאין שום דבר. בואו ננסה שוב את אותו קנה המידה של נתונים באמצעות זמן הלוגרימי-X. כאשר הסרלים עוזים משמאל לימין, הם יגדילו את כוח של 10:
אז כמה נקודות מרכזיות הן: כאשר אתה רוצה לפצח כמה hash סיסמה, סיבוב יחיד קל יותר מאשר סיבוב מרוב וחסר מלח מאשר הוספת מלח. להיפך, כאשר חברות או אתרים מסוימים מכריזות על דליפת נתונים המכילים נתוני משתמש, א) עדיף סיסמאות להיות hashed, לא רק טקסט פשוט; ב) הם עדיף מלוחים, לא רק חש; ג) עדיף שיש להם כל הזמן להשתמש במלח רב סיבוב חזק, לא רק סיבוב בודד.
זיהוי סוג hash
לפני ניסיון לפצח hash קריפטוגרפי נתון, הסדק יבין איזה אלגוריתם hash משמש כדי ליישם אותו. זיהוי סוגי hash הוא בדרך כלל פשוט, אבל זה לא תמיד. Crackers עושים בדרך כלל ניחושים מבוססים על רמזים כגון אורך הפורמט של חש. בסופו של דבר, הדרך היחידה כדי לוודא אם סוג ההאש נכונה היא אם ההאש נסדק.
מסופקים כאן כמה משאבים מצוינים למשימה זו, שניהם מראות איך ערכי ההאש הנפוצים נראים.
Kali Linux מסופקת חבילת תוכנה "hash-identifier" (זמינה כאן) כדי לסייע לזיהוי סוגי hash לא ידועים.
התנגשות
כאשר שתי קלטים שונים גורמים לאותה פלט hash, מתרחשת סכסוך. זה רע (כמובן). עבור סיסמאות, זה עשוי להיות אומר שאולי לא סדק את הסיסמה בפועל שלך, אבל מכיוון שמצאתי קלט המייצר את אותו ערך האש, אני יכול להשתמש בערכי טקסט פשוטים כדי להטעות את המערכת כדי לחשוב שהסיסמה היא חוקית.
Microsoft Office משתמשת באלגוריתם נוטה לסכסוך במשך שנים רבות בהגנה על המסמכים שלה. זה לא נדיר למצוא קונפליקטים מרובים של חש יחיד, וכל זה יפתחו את המסמך.
ברגע שמתגלה סכסוך, האלגוריתם ייהרס למעשה. אם זה קורה פעם אחת, אז מבחינה סטטיסטית, זה צפוי לקרות שוב. הדבר היחיד שמעכב לנו הוא זמן וכוח העיבוד. ככל שהאלגוריתמים הופכים להיות חזקים יותר, ליצור אלגוריתמים מועמדים ולהשוואת תפוקת האש כדי לחפש אותם דורש יותר יכולת וזמן. כתוצאה מכך, מעצבים הופכים יותר ויותר טובים ביצירת אלגוריתמים שהם פחות נוטים לסכסוך.