JWT
-
אני משתמש בJWT לאימות משתמשים באתר שלי
בקצרה זה עובד שיש לי secret קבוע המורכב מסטרינג של תווים וסימנים וכו' ארוך שאני יצרתי, וכל פעם שאני יוצר טוקן זה מקבל את ה secret ותוקף ונתונים אופציונאלים כגון פרטי ID של המשתמש וכו' וזה לוקח את ה secret ובאיזה שהיא דרך מצפין את המידע והתוקף.
בעת הזדהות הוא מפרק את הטוקן מול קוד ההצפנה שנוצר מה secret שלי, ואם זה תואם הטוקן מפוענח ונעשית בדיקה שהתוקף בסדר וזה תקין
הטוקנים לא נשמרים כלל בבסיס נתונים אלא תמיד בהשוואת הטוקן מול secret יש את המידע האם הטוקן טוב או לא, ולכן אין אפשרות למחוק טוקן, (אלא א"כ ע"י התערבות חיצונית של רשימת טוקנים חסומים וכדומה)
עד כאן פחות או יותר מה שהבנתי
משהו אחד לא כ"כ ברור לי, לו יכולתי לזייף טוקן, דהיינו ליצור מחרוזת שהפיענוח שלה תתאים לsecret הנמצא בשרת הנתקף, יהיה לי גישה כאילו יש בידי טוקן שנוצר באמת ע"י השרת? דהיינו לאפוקי מעוגיות שבדר"כ יש בשרת טבלה של העוגיות והתוקף והשרת בודק בטבלה האם יש לו עוגיה כזו ולא פג תוקף, ואם לא יצרתי מעולם את העוגיה זה אף פעם לא יעבוד, ב JWT אם אני מבין נכון באמת לא צריך בכלל ליצור את הטוקן, אלא הוא פתוח מתחילה ועד סוף שבמידה ויש טוקן שתואם לsecret זה יתן להמשיך הלאה
תיאורטי אם אני יריץ תוכנה שתעבור עם לולאה ותנסה לפרוץ את השרת ע"י שליחה של מיליארדי מחרוזות של צירופי אותיות וכו' שיגיע בסוף לטוקן אמיתי זה יהיה אמור להיפרץ למרות שמעולם לא יצרתי כזה טוקן.
הבנתי נכון? -
אבל אפשר לעשות אותו דבר גם בטוקן רגיל.
ברור שאפשר לנסות לנחש טוקן רגיל, אבל אם מעולם לא יצרת טוקן אז מעולם לא פתחת שער.
בשאלתי רציתי להבין את הלוגיקה של JWT, שלמיטב הבנתי וזאת ברצוני לקבל אישור בשאלתי, גם אם מעולם לא יצרת טוקן עדיין ניתן לפרוץ את זה, כי ברגע שהתקנת JWT על השרת פתחת את השער וכל מחרוזת שיכולה להתאים ל sercet תפתח את השער. -
@יוסף-בן-שמעון אמר בJWT:
באמת כדאי להחליף טוקן מידי פעם
אני לא באתי כאן ממקום של חשש, אלא חשוב לי להבין לעצמי את הלוגיקה של הכלים שאני איתם.
ואני לא חושב שזה הרבה משנה, כי אם יש לפורץ אינטרס לעשות זאת לשרת מסויים והוא ינסה לבצע מתקפה כזו אני לא רואה שמה ששיניתי את הsercet לפני חודש קצת ישנה את האתגר של הפורץ -
@חוקר אני יכתוב את מה שאני הצלחתי להשיג בהבנתי הדלה בנושא הנ"ל של JWT.
הרעיון העיקרי של JWT הוא לאפשר מנגנון קומפקטי ככל הניתן לאימות משתמשים (אותנטיקציה) והרשאות (אותוריזציה).
דבר ראשון, JWT לא מיועד להעברה של נתונים סודיים על גביו (במימוש הרגיל שלו לכל הפחות), משום ששתי השדות הראשונים שלו (ה-Header וה-Payload) מקודדים בסך הכל ב base64 שניתן לפיענוח בקלות רבה.
כשהשרת מקבל בקשה מסויימת עם header כדלהלן (אני מדבר בשרת שתוכנת לפי הסטנדרט של JWT כמובן, כי השליחה יכולה להיעשות במגוון דרכים):Authorization: Bearer <JWT Token>
השרת לא נצרך לגשת לבסיס נתונים כלשהו כדי לקבוע את רמת ההרשאה של אותו קליינט, משום שכל המידע מונח כבר בתוך אותו טוקן.
לצורך העניין, אפשר להכניס לשדה ה-Payload את השדה הבא:isAdmin: true
השרת בודק את שדה ה-Payload, מוודא (באמצעות השדה השלישי ב-JWT) שאף גורם חיצוני לא טיפל בטוקן, רואה שמדובר בלקוח שהוא בדרגת מנהל, ולפי זה קובע את מרחב האפשרויות המותר לו.
בשביל הבדיקה הזאת שאף גורם זדוני לא שינה לעצמו את השדה
isAdmin
ל-true
, נצרך אותו secret key. מה שהשרת עושה כשהוא חותם טוקן של JWT, הוא לוקח את אותו payload, ומעביר אותו דרך אלגוריתם מסויים שיוצר Hash שייחודי לקלט של אותו payload בצירוף של המפתח הסודי (מה שכמובן לא ניתן להוציא מהפלט), ומכניס אותו לטוקן בתור השדה השלישי (מה שמכונה 'שדה החתימה'). -
@מוטי-אורן מה זה שונה מקובץ PDF לדוגמה שחתומה בחתימה דיגיטלית?
קודם כל זה באמת די דומה לדעתי...
העניין הוא בערך כזה (אני מדגיש מראש שאני כותב רק מה שידוע לי. יכול להיות מאוד שאני טועה).
קודם כל אני ינסה להסביר איך עובד המנגנון של חתימה דיגיטלית באופן כללי (כמו PDF בדוגמה שלנו), ואתה תראה לבד שזה די דומה.
הרעיון של חתימה דיגיטלית הוא כזה: אני לוקח את המידע שאני רוצה להפיץ, לצורך העניין את קובץ ה-PDF,מבצע הצפנה שלובאמצעות מפתח פרטי שנשאר אצלי, ואת המפתח הציבורי (היחיד) שפותח את ההצפנה שלו אני מפיץ לציבור (שימו לב כמה זה דומה להצפנה אסימטרית, רק הפוך בדיוק), ואני משרשר את התוצאה מיד לאחר המידע עצמו, וכמובן שאין שום דרך נורמלית לקבל את המפתח המצפין דרך המפתח המפענח.
כך שאם גורם כלשהו ירצה לוודא את האותנטיות של המידע, של קובץ ה-PDF, הוא ייקח את המפתח הציבורי שלי שידוע לכולם, ואם קרה וגורם נוסף שינה את המידע, הוא יראה מיד שהמידע לא מקורי.הרעיון ב-JWT הוא דומה. כאן אנחנו לוקחים את התוצאה (מה שמכונה Hash), ומשרשרים אותה למידע עצמו.
עריכה: כעת נודע לי שההצפנה לא מתבצעת על המידע עצמו, אלא על ה-Hash שנוצר מהמידע, מטעמי חיסכון.