שְׁאֵלָה:
מה השימוש בשירות הלקוח?
user700503
2011-04-10 07:56:56 UTC
view on stackexchange narkive permalink

לאחר שקראתי את חלק א 'בספרו של רוס אנדרסון, הנדסת אבטחה , והבהרתי כמה נושאים בוויקיפדיה, נתקלתי ברעיון של לקוח נונס (cnonce). רוס מעולם לא מזכיר זאת בספרו ואני נאבק להבין את המטרה שהיא משרתת באימות משתמשים.

נעשה שימוש במונח רגיל כדי למנוע התקפות חוזרות הכוללות שימוש בתגובה שפג תוקף כדי להשיג הרשאות. השרת מספק ללקוח nonce (מספר בשימוש ONCE) שהלקוח נאלץ להשתמש בו כדי לחתוך את תגובתו, השרת מכיל את התגובה לה הוא מצפה עם ה- nonce שהוא סיפק, ואם ה- hash של הלקוח תואם את ה- hash של השרת ואז השרת יכול לוודא שהבקשה חוקית ורעננה. זה כל מה שהוא מאמת; תקף ורענן .

ההסברים שמצאתי עבור לקוח שאינו מכיל הם פחות פשוטים ומפוקפקים. נראה שדף ויקיפדיה לאימות גישה דיגיטלית וכמה תגובות כאן ב- Stackoverflow מצביעים על כך שנעשה שימוש בלקוח של לקוח כדי להימנע מהתקפות טקסט פשוט. יש לי כמה בעיות עם הרעיון הזה:

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

אז מה המטרה של cnonce?

אני מניח שיש חלק כלשהו במשוואה שאני לא מבין אבל עדיין לא מצאתי הסבר מה זה החלק הזה.

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

ארבע תשובות:
Thomas Pornin
2011-04-11 18:03:24 UTC
view on stackexchange narkive permalink

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

לדוגמה, שקול פרוטוקול אימות מבוסס סיסמה אשר הולך כך:

  • השרת שולח "אתגר" (ערך אקראי כביכול c ) אל לקוח
  • לקוח יגיב על ידי שליחת h (c || p) כאשר h היא פונקציית hash מאובטחת (למשל SHA-256), p היא סיסמת המשתמש, ו- ' || ' מציין שרשור
  • השרת מחפש את הסיסמה במסד הנתונים שלו, מחשב מחדש את תגובת הלקוח הצפוי ורואה אם זה תואם את מה שהלקוח שלח

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

דמיין תוקף פסיבי: התוקף מצותת אך אינו משנה את ההודעות. הוא רואה את c ו- h (c || p) ולכן הוא יכול להשתמש באשכול שלו כדי למנות סיסמאות פוטנציאליות עד למציאת התאמה. זה יהיה יקר עבורו. אם התוקף רוצה לתקוף שתי סיסמאות אז עליו לבצע את העבודה פעמיים . התוקף רוצה ש יהיה חלוקת עלויות מעט בין שני מופעי ההתקפה, תוך שימוש ב טבלאות מחושבות מראש ("טבלאות קשת" הן רק סוג של טבלה מחושבת מראש עם אחסון מותאם; אך בניית שולחן קשת עדיין מחייבת ספירת המילון המלא וחשיבת כל סיסמא). עם זאת, האתגר האקראי מביס את התוקף: מכיוון שכל מופע כרוך באתגר חדש, קלט פונקציית החשיש יהיה שונה בכל הפעלה, גם אם משתמשים באותה סיסמה. לפיכך, התוקף אינו יכול לבנות שולחנות שימושיים מחושבים מראש, בפרט שולחנות קשת.

כעת נניח שהתוקף יהפוך פעיל. במקום פשוט להתבונן בהודעות, הוא ישנה באופן פעיל הודעות, ישליך כמה, ישכפל אחרים או יכניס הודעות משלו. התוקף יכול כעת ליירט ניסיון חיבור מצד הלקוח. התוקף בוחר ושולח אתגר משלו ( c ') ומחכה לתגובת הלקוח ( h (c' || p) ). שים לב כי אין ליצור קשר עם השרת האמיתי; התוקף פשוט מפיל את החיבור בפתאומיות מיד לאחר תגובת הלקוח, כדי לדמות שגיאת רשת שפירה. במודל התקפה זה, התוקף ביצע שיפור גדול: עדיין יש לו אתגר c ' והתגובה המקבילה, אך האתגר הוא ערך שהתוקף בחר כראות עיניו. מה שהתוקף יעשה זה תמיד לשרת את אותו אתגר c '. שימוש באותו אתגר בכל פעם מאפשר לתוקף לבצע חישובים מוקדמים: הוא יכול לבנות טבלאות מחושבות מראש (כלומר שולחנות קשת) המשתמשות ב"אתגר "המיוחד הזה. כעת התוקף יכול לתקוף מספר סיסמאות נפרדות מבלי לחייב את עלות ספירת המילון עבור כל אחת.

nonce client נמנע מבעיה זו. הפרוטוקול הופך להיות:

  • השרת שולח אתגר אקראי c
  • הלקוח בוחר n (לא צריך להיות שונה) בכל פעם)
  • הלקוח שולח את n || h (c || n || p)
  • שרת מחשב מחדש h (c || n || p) (באמצעות ה p em ממסד הנתונים שלו) ורואה אם ​​ערך זה תואם את מה שהלקוח שלח

מכיוון שהלקוח כולל ערך אקראי חדש ("nonce") בקלט פונקציית hash לכל הפעלה, קלט פונקציית hash יהיה שונה בכל פעם, גם אם התוקף יכול לבחור את האתגר. זה מנצח טבלאות מחושבות מראש (קשת) ומשקם את רמת האבטחה המיועדת שלנו.

הדמייה גסה של nonce ייחודי הוא שם המשתמש. לשני משתמשים נפרדים באותה מערכת יהיו שמות נפרדים. עם זאת, המשתמש ישמור על שמו כאשר הוא ישנה את סיסמתו; ושני משתמשים נפרדים עשויים להיות בעלי אותו שם בשתי מערכות שונות (למשל, לכל מערכת דמוית Unix יש משתמש "שורש"). אז שם המשתמש אינו נונסקה טובה (אך עדיין עדיף על כך שאין לו בכלל נונסון של לקוח).

לסיכום, הלקוח nonce עוסק בהגנה על הלקוח מפני התקפת שידור חוזר (" שרת "להיות למעשה תוקף, שישלח את אותו אתגר לכל לקוח שהוא רוצה לתקוף). אין צורך בכך אם האתגר מבוצע בערוץ הכולל אימות שרתים חזק (כגון SSL). חילופי מפתח מאומת סיסמאות הם פרוטוקולים מתקדמים המבטיחים אימות הדדי מבוסס סיסמא בין לקוח לשרת, מבלי להזדקק לאמון מוקדם יותר ("אישורי הבסיס" כאשר לקוח SSL מאמת את אישור שרת ה- SSL) והגנה נגד תוקפים פעילים ופסיביים (כולל התקפת "אשכול לשבועיים" על סיסמה אחת, כך שזה טוב יותר מהפרוטוקול לעיל, nonce או no nonce).

וואו. תודה! הלוואי שיכולתי להצביע שוב.
באימות עיכול השרת שולח nonce ואז הלקוח שולח את אותו nonce בחזרה. נראה לי ש- nonce של לקוח רק באמת שימושי כאשר השרת לוקח את מה שהלקוח אומר שהוא nonce בערך נקוב במקום מה שהשרת עצמו, יצר? אם חיבור ה- HTTP היה שומר על החיים נראה לי שהשרת יכול היה לדעת מה היה הריק שהוא שלח זה עתה.
@paynes_bay חוסר מדינה הוא לעיתים תכונה רצויה בעת שימוש ב- HTTP, במיוחד מטעמי מדרגיות וזמינות גבוהה. אי שליחת ה- nonce בחזרה לשרת תהפוך את אימות Digest לממלכתי.
מתוך סקרנות - האם זה מרכיב חשוב של הלקוח שאינו מחייב שהשרת עוקב ומתעד אחר כל אחד כזה, שהאימות נדחה כאשר נעשה שימוש חוזר גם בקשרי הלקוח?
רק כדי להבהיר: הלקוח nonce נועד במיוחד למקרה שהתוקף הוא השרת, נכון?אחרת, גם אם אני מעבר לערוץ מאובטח, מישהו / מיירט עדיין מעביר את הבקשה שוב (שידור חוזר) מבלי לפענח אותה.אך עבור סוג כזה של התקפות, אנו משתמשים במנגנונים אחרים, כמו מונה לבקשות (ללא כוונה) וכאלה.
Bosh
2011-04-10 11:12:22 UTC
view on stackexchange narkive permalink

תן לי לנסות להגיב לבשר של שאלתך: "בהנחה שנייה שהתוקף לא רוצה לעסוק בהתקפה של אדם באמצע ורוצה לשחזר את פרטי האימות, איך cnonce מספקים הגנה נוספת? "

בדרך כלל לקוח לא רק כולל nonce עם הבקשה, אלא ש חותם על כל הבקשה, כולל nonce . פירוש הדבר שגם אם התוקף מיירט הודעה בין לקוח לשרת:

  1. מתקפת שידור חוזר לא תפעל (מכיוון שהשרת עוקב אחר אי-צרכי הלקוח).
  2. התוקף לא יכול פשוט ליצור הודעה חדשה עם לקוח חדש כי הוא לא יודע כיצד לחתום על ההודעה החדשה כראוי (כלומר היא חסרה את סוד לקוח, או מפתח פרטי).
האם לקוח שאינו מיוצר אינו שובר את מודל התגובה לאתגר? איזו השפעה יש לכך? קנאנס יכול לאשר שההודעה לא נראתה לפני כן, אך לא שהיא טרייה. במילים אחרות, זה פותח את המערכת לתזמון התקפות שבהן תוקף מיירט את תגובת הלקוחות, שולל שירות ומשתמש מחדש בתגובה.
הלקוח יכול לכלול זמן תפוגה. אם השרת מקבל את ההודעה לאחר התפוגה הכלולה בהודעה (חתומה), הוא מתייחס להודעה זהה כאילו החתימה לא חוקית.
@Justice זה מציג בעיות של זמן סינכרון וכן הלאה. איך השרת יודע מה השעה על הלקוח? זה יהיה קל לזייף.
זיוף אינו יכול לזייף זמן תפוגה מכיוון שזמן התפוגה הוא חלק מההודעה שנחתמה. ב- HTTP, סנכרון שעון אינו נדרש מכיוון שהלקוח מקבל תמיד זמני שעון מהשרת; בעוד הלקוח עשוי לחשב משך בהתבסס על מדידת השעון שלו, הוא תמיד יוסיף את משך הזמן לשעון מהשרת כדי לקבל זמן שעון נוסף.
@Justice פשוט הבנתי ששימוש בזמן השרת ושינויו לפי זמן הלקוח הוא באמת רק עוד דרך ליישם nonce של השרת. כך שלמעשה שימוש בזמן בדרך זו פשוט פשוט שימוש בשרת nonce.
אני חושב ש"חתימה "כאן מתייחסת לחותמת אותנטיות כלשהי (כמו HMAC או sth).
OJ
2011-04-10 08:50:24 UTC
view on stackexchange narkive permalink

אני חושב שרעיון טוב יהיה לקרוא על אופן השימוש בערך nonce במשהו כמו Oauth. בקיצור, כאשר יישום המשתמש ב- OAuth מגיש בקשה להגשה הנתמכת על ידי OAuth, הבקשה חייבת להכיל חבורה של שדות, שניים מהם חותמת זמן ולא. מטרת הטופס ברורה: היא נותנת אינדיקציה על פרק הזמן שההודעה נשלחה כדי שהשרת יוכל לנחש טוב יותר אם ההודעה מעופשת או לא. האחרון הוא ללא ספק חבורה של תווים / בתים אקראיים.

כאשר כותרת ה- OAuth כולה מסופקת עם סוד הצרכן, שני השדות הללו נכללים. ואז החתימה שלה היא צירפה לבקשה (בין אם מדובר בפרמטרים של שאילתה או כותרות HTTP) ונשלחה לשרת. גוף בפועל של הבקשה הוא לא hashed.

שרת OAuth צריך לעקוב אחר הסט הקודם של ערכי N nonce עבור לקוח נתון ודא שלא נעשה בהם שימוש חוזר. בהתחשב בכך שגוף ההודעה יכול להשתנות (למעשה אין לו השפעה על הגיבוב) חשוב שיהיה משהו אחר שישתנה (כלומר השקט) כדי לוודא שהבקשות ייחודיות. בהתחשב באופי הטקסט הפתוח / הפשוט של HTTP, זה די חשוב.

האם זה מסייע בכלל להבהיר את מטרתו? (מקווה שכן :)).

האם OAuth לא מפר את מודל תגובת האתגר בכך שהצרכן יוצר את ה- nonce? האם זה לא רע? משתמש אחד יכול לאשר שההודעה לא נראתה לפני כן, אך לא שהיא טרייה. במילים אחרות, זה פותח את המערכת לתזמון התקפות שבהן תוקף מיירט את תגובת הלקוחות, מכחיש שירות ומשתמש בתגובה.
paynes_bay
2011-07-11 04:33:00 UTC
view on stackexchange narkive permalink

על פי RFC 2617, הפרמטרים cnonce ו- nc מגנים מפני התקפות טקסט פשוט. כיצד זה מגן מפני התקפות מסוג זה?

אם Eve משנה את הרעיון שהשרת שולח ללקוח מה הרוויחה Eve? חוה לא יכולה ליצור h (סיסמה || nonce) מ- h (סיסמה || fake_nonce) ובתיאוריה נראה שהשרת לא צריך לקבל את h (סיסמה || fake_nonce) בכל מקרה מכיוון שהשרת אמור לדעת איזה מונפקה הוא הונפק ואיזה מונח לא.

אם אתה שואל שאלה, היא כנראה צריכה להיכנס לשאלה נפרדת, ולא בתשובה כאן.
זו כמעט אותה שאלה שנשאלת כאן. אני רוצה לדעת מה השימוש בלקוח של הלקוח. RFC2617 מספק תשובה אך תשובה זו אינה הגיונית בעיניי. תומס פורין סיפק תשובה גם כן, אך גם תשובתו אינה הגיונית מבחינת תגובתי לתשובתו.
@paynes_bay ברוכים הבאים לאתר! אנא קרא את [שאלות נפוצות] - התשובות מיועדות, ובכן, * לענות על השאלה. אם אתם מחפשים הבהרה על תשובה אחרת, ההערות עובדות. אם אתה רוצה מידע נוסף שאינו מכוסה בשאלה המקורית, שאל אחר!


שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...