
hash.js שמשתמש במודול crypto, עם פונקציה שמקבלת סיסמה ומחזירה crypto.createHash("sha512").update(password).digest("hex"). חושפים אותה ב-module.exports.user.password לפני השמירה.credentials.password לפני השאילתה.crypto.createHash("sha512") ואחריו update ו-digest("hex"), כאשר SHA-512 הוא האלגוריתם החזק שנבחר, ו-SHA-1 נחשב ישן ולא בטוח.הטקסט המלא של הדקות הראשונות בהרצאה «גיבוב האשינג של סיסמאות משתמשים - Hashing User Password» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
הבעיה הבאה שקיימת אצלנו זה בעיה שנמצאת בכלל בדאטאבייס. בואו ניכנס רגע לנורת'ווינד ונלך לטבלת המשתמשים.
כאן אנחנו רואים שיש לנו קוד משתמש, שם פרטי, שם משפחה, שם משתמש וסיסמה. והנה אנחנו רואים שאם היוזר מכניס מושיקו ו1234, בואו נעשה את זה, מושיקו ו1234, אני לא הוגה in, ואנחנו רואים שהצלחנו להיכנס למערכת ואנחנו יכולים לדוגמה לצפות בכל המוצרים.
מה הבעיה? הבעיה שהסיסמה גלויה בדאטאבייס. למה זה בעצם בעיה? כי אנחנו לא יכולים לדעת למי בעצם בחברה, בעסק, בשרת, אנשי ה-IT, אנשים שמסתובבים שם, יש גישה לדאטאבייס.
סיסמה לא אמורה להיות גלויה בשום מקום, ואנחנו רואים כאן את הסיסמה as is, זה נקרא plain text. עכשיו, יכול להיות שהבחור שאחראי על ה-IT הוא לא כזה אתי ורואה את הסיסמה ואת השם משתמש שלנו ויכול להיכנס במקומנו.
יכול להיות שמישהו במקרה רואה את זה, יכול להיות שהוא רואה שיש לנו גם אימייל ואולי הסיסמה זהה לאימייל ומצליח לפרוץ לנו לאימייל. אנחנו לא רוצים שהסיסמה תהיה as is plain text בדטאבייס, אסור אף פעם שסיסמאות יהיו plain text בדאטאבייס.
אז איך אנחנו פותרים את זה? אז במבט ראשון נראה שכל מה שאנחנו צריכים לעשות זה להצפין את הסיסמה ואז מתישהו לפענח אותה. כלומר, נראה כאילו שאם היוזר מבצע את פעולת ה-register, אז היוזר מכניס לנו סיסמה, לדוגמה הוא אומר אני רוצה את הסיסמה 1, 2, 3, 4, למרות שהיא לא כזאת חזקה, אבל נדבר
על זה בהמשך. ואנחנו מצפינים אותה ואנחנו הופכים אותה כמובן כתלות באלגוריתם ההצפנה ל-X 8 כוכבית כוכבית ודולר.
נניח שזה ההצפנה של 1, 2, 3, 4. זה היה בתהליך הרג'יסטריישן, איך שהוא נכנס כיוזר חדש. ואז כאשר היוזר מבצע לוג אין, מה אנחנו צריכים לעשות?
בדאטאבייס הרי אנחנו לא שומרים פליין טקסט, אנחנו שומרים את ההצפנה. אז כאשר הוא מבצע לוגין אנחנו הולכים לדאטאבייס, קודם כל הוא מכניס 1234 הרי, ואז מה שאנחנו יכולים לעשות זה ללכת לדאטאבייס, לשלוף את x8*$ ולהחזיר את זה מבחינת פענוח ל-1234 ואז להשוות את הערך המפוענח של הסיסמה למה
שהיוזר הכניס. אבל ולא מה שנתבצע וזה לא מה שאנחנו רוצים לעשות כאשר אנחנו צריכים להצפין סיסמאות בדאטאבייס, יש לזה כל מיני סיבות.
סיבה אחת אם מישהו רואה את אלגוריתם ההצפנה ואת אלגוריתם הפענוח שעשינו בתוכנית אז הוא יכול בעצמו לבצע את הפענוח הזה ואז לגלות את הסיסמה. אנחנו רוצים לבצע משהו אחר אנחנו לא רוצים לבצע הצפנה ופענוח כמו שיש פה, זה לא מה שעושים עבור סיסמאות.
מה שאנחנו רוצים לבצע זה משהו שנקרא השינג. זה נקרא encryption or decryption ואנחנו רוצים השינג. השינג זה משהו אחר. אש זה בעצם אלגוריתם שלוקח את הטקסט שלנו והופך אותו לאיזושהי מחרוזת, זה נקרא בעברית גיבוב, מחרוזת מגובבת, מגובבת, שאין אפשרות מבחינה
מתמטית או מבחינה של לוגית לחזור אחורה, כלומר לפענח את המכרוזת המגובבת בחזרה למכרוזת המקורית.
אז אם נניח אנחנו לוקחים ומבצעים האשינג, פה חסר לי h כמובן, על 1, 2, 3, 4, אז יכול להיות שהאלגוריתם ימצא לנו איזה מכרוזת אחרת, לדוגמה r, 6, דולר, שטרודל, P, Q ועוד כמה ערכים.
זה לא חייב להיות באותו אורך, כן? בוא נניח שזה ההאשינג של 1, 2, 3, 4 לפי איזשהו אלגוריתם האשינג מסוים. אי אפשר לקחת את הדבר הזה ולהחזיר אותו ל-1, 2, 3, 4, אבל אנחנו צריכים להבין כמה עקרונות מעניינים בנוגע לאלגוריתם הזה של האשינג.
עיקרון ראשון, אם אנחנו משתמשים באלגוריתם, יש כל מיני אלגוריתמי האשינג, אם אנחנו לוקחים אלגוריתם ספציפי, לדוגמה יש אלגוריתם שנקרא SHA-1, יש כל מיני מספרים, 256, יש SHA-512, יש MD-5, יש כל מיני אלגוריתמי האשינג,
אם אנחנו לוקחים איזשהו אלגוריתם ספציפי, ולוקחים את המספר 1, 2, 3, 4 ועושים לו האשינג, אז פעם הבאה שניקח 1, 2, 3, 4 וכמובן נשתמש באותו אלגוריתם אנחנו נקבל תמיד את אותה המחרוזת של ה-hash.
זאת תכונה ראשונה של השינג. תכונה שנייה, אף מחרוזת אחרת עד גודל מסוים לא תיתן לנו את אותו ה-hashing, זאת אומרת שזה ייחודי.
אז אם למישהו נתן 1, 2, 3, 4 ויצא את זה, רק 1, 2, 3, 4 תחזיר לנו את ה-hashing הזה. זאת תכונה שנייה שיש. ותכונה שלישית, כאמור, נוסחה לוגית שמצליחה להחזיר מפה לפה אוקיי זה בעצם הפטנט שיש כאן אז איך עכשיו אם אי אפשר לפענח את זה אנחנו יכולים להשתמש בהאשינג כי אנחנו עושים את ההאש ברג'יסטריישן בואו ניקח את הרג'יסטר
מבצעים את פעולת ההאשינג ואז היוזר מכניס בתהליך ההרשמה 1234 אנחנו מייצרים לו את זה ושומרים לו בדטאביס הוא נכנס ללוגין מחר מחרתיים בעוד חודש מכניס 1, 2, 3, 4 כי זאת הסיסמה שלו.
איך אנחנו עכשיו לוקחים את זה ומפענחים כמו שעשינו פה בכדי לקבל בחזרה את הסיסמה אנחנו לא יכולים אבל מה אנחנו כן יכולים לעשות? שוב פעם האשינג ואם הוא נתן לנו את אותה מחוזת אנחנו בדיוק נקבל את אותו האש ואז מה שאנחנו צריכים לעשות זה להשוות בין ההאשים ההאש בתהליך ה-registration עם ההאש בתהליך ה-login
אם הם שווים הוא הכניס את אותן סיסמאות. זה מה שתמיד מבצעים עבור סיסמאות בדאטאבייס, אז בואו נעשה את זה. אז אנחנו חוזרים לקוד ואנחנו הולכים ל-Helpers ויוצרים איזושהי פונקציה אש.ג'י.אס שנמצאת בתוך קובץ אש.ג'י.אס.
בואו ניקח כאן את, אנחנו בעצם רוצים, אנחנו רוצים את rip, אם אני זוכר נכון,