none
איך לקבל את הסיסמא לאחר הזדהות, בשימוש ב-UserNamePasswordValidator

    שאלה

  • יש לי ווב סרוויס wcf שמורכב ממספר dll-ים.

    dll אחד בשביל אימות לקוח, האימות מתבצע באמצעות מחלקה שיורשת מהמחלקה האבסטרקטית UserNamePasswordValidator. האימות עובד בלי בעיות.

    הגדרת צורת האימות ב-web.config:

    <message clientCredentialType="UserName" />

    יש לי dll נוסף שבו מתבצעות בקשות הלקוח.

    ב-dll זה אני ניגשת לשם המשתמש בצורה הבאה:

    OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name

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

    שאלתי היא:

    איך ניתן לקבל את הסיסמא לאחר שהמשתמש אומת?

    יום ראשון 07 מאי 2017 07:08

כל התגובות

  • בוקר טוב,

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

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


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]

    יום רביעי 24 מאי 2017 05:42
    משיב
  • אני חוששת שלא הבנתי את התשובה.

    השאלה שלי היא האם הסיסמא שהמשתמש שלח, שאותה קיבלתי בפונקציה Validate, נשמרת באיזה מקום בצורה שאוכל לקבל אותה אח"כ.

    הרי בפונקציה עצמה אני מקבלת את הסיסמא בצורה לא מקודדת.

    יום רביעי 24 מאי 2017 07:10
  • לא בדקתי ספציפית את המחלקה איתה את עובדת כרגע אבל הנוהל הוא פשוט:

    הססמה נשמרת בצורה מוצפנת (ברך כלל גם מקודדת אבל זה כברלא קשור כרגע לדיון), ולא ניתן בצורה מובנית לקבל אותה אחר כך

    בפונקציה את לא מקבלת את הססמה אלא רק מאשרת אם הססמה נכונה

    בואי נראה דוגמה פשוטה לא אמיתית אבל שמדגימה את הבעיה:

    נניח שיש לנו פונקציית hash להצפנת מספרים: כל מספר זוגי מחזיר את הערך 1, כל מספר אי זוגי מחזיר את הערך 2

    המשתמש מכניס את הערך 21 ולכן במסד הנתונים ישמר הערך המוצפן 1
    המשתמש מכניס את הערך 22 ולכן במסק הנתונים ישמר הערך המוצפן 2
    המשתמש מכניס את הערך 11 ולכן במסד הנתונים נשמר הערך 1 - שוב פעם

    עתה, האם את יכולה למצוא מה הכניס המשתמש כאשר במסד הנתונים נשמר הערך 1 ?

    התשובה היא לא! הפעולה אינה הפיכה ולא ניתן למצוא את הערך המקורי מתוך הערך המוצפן

    אבל אנחנו עדיין יכולים לבצע אימות "סביר" של ססמה: אם המשתמש שואל האם הססמה שלי היא 21 אז אנחנו יכולים להישתמש בפונקציית ה hash שלנו ולגלות שהערך 21 אכן מתאים לערך המוצפן 1 שנשמר במסד הנתונים ולכן המשתמש מקבל את התשובה כן.

    ** בדוגמה למעלה התשמשתי בפונקציית Hash שמחזירה רק 2 אפשרויות ולכן האימות שלנו לא ממש יעיל. 50% מהנסיונות יקבלו תשובה חיובית. אבל אם במקום לבדוק את המפר זוגי או אי זוגי הייתי משתמש בלוגיקה יותר מורכבת. למשל פונקציית hash שמחזירה את המודולו 1000 של מספר (מודולו זה השאילת אחרי חלוקה במספר).

    המשתמש מכניס את הערך 21 ולכן במסד הנתונים ישמר הערך המוצפן 21
    המשתמש מכניס את הערך 22 ולכן במסק הנתונים ישמר הערך המוצפן 22
    המשתמש מכניס את הערך 11 ולכן במסד הנתונים נשמר הערך 11 - הפעם אין לנו חזרה במקרה של 11
    אבל מה יקרה אם ניכס את הערך 1001 ? המודולו של 1001 יחזיר שוב הערך 1

    ולכן שוב אם ננסה לחמצוא את הערך המקורי לפי הערך במסד הנתונים אנחנו לא יכולים לדעת. אם במסד הנתונים ישלנו את הערך 1 אנחנו לא יכולים אם הערך האמיתי הוא 1 או 1001 או 2001 או 1000001. אבל עדיין אנחנו יכולים לבצע אימות של ערכים.

    *** פונקציות ה hash שבהם עושים שימוש להצפנת ססמאות הן הרבה יותר מוררכבות כמובן והסיכוי ששני ערכים יחזירו את אותה תוצאה קטנה, אבל עדיין קיים. פונקציות hash הן פונקציות על יחס רבים לאחד ז"א מספר Input עלולים להחזיר את אותו output ולכן יידעה של מה הוא ה output לא מאפשרת למצוא את ה input


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]

    יום רביעי 24 מאי 2017 13:40
    משיב
  • אני חושבת שיש כאן איזשהו חוסר הבנה.

    אין לי בעיה לאמת את הסיסמא מול הדטה בייס. בדטה בייס שלי הסיסמא אכן נשמרת בצורה מוצפנת, בהצפנה חד כיוונית.

    לא זו השאלה שלי!!!!

    השאלה שלי אחרת!!!

    יש פונקציה: 

    Validate(string userName, string password)

    זוהי פונקציה מובנית במחלקה UserNamePasswordValidator שבאופן אוטומטי מקבלת את שם המשתמש והסיסמא שהמשתמש שלח לשם אימות ב-wcf.

    השאלה שלי:

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

    הנושא הוא ממש ממש לא הצפנה ופיענוח של סיסמאות.

    יום חמישי 25 מאי 2017 06:17
  • אני חושבת שיש כאן איזשהו חוסר הבנה.

    אין לי בעיה לאמת את הסיסמא מול הדטה בייס. בדטה בייס שלי הסיסמא אכן נשמרת בצורה מוצפנת, בהצפנה חד כיוונית.

    לא זו השאלה שלי!!!!

    השאלה שלי אחרת!!!

    יש פונקציה: 

    Validate(string userName, string password)

    זוהי פונקציה מובנית במחלקה UserNamePasswordValidator שבאופן אוטומטי מקבלת את שם המשתמש והסיסמא שהמשתמש שלח לשם אימות ב-wcf.

    השאלה שלי:

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

    הנושא הוא ממש ממש לא הצפנה ופיענוח של סיסמאות.

    היי,

    >> אין לי בעיה לאמת את הסיסמא

    זה בדיוק מה שהסברתי :-) אין בעיה לאמת ססמה אבל לא ניתן למצוא ססמה כאשר עובדים עם פונקציות hash.

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

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

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

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

    ולכן ניסתי להסביר שאפשר לאמת את הססמה אבל לא לקבל אותה.

    כרגע אני לא בטוח שאני מבין את הצורך והשאלה לפי ההסבר האחרון :-)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]


    יום חמישי 25 מאי 2017 11:38
    משיב