אני שומר שם משתמש וסיסמה שהמשתמשים שלי יצרו אצלי בDB.
אני מצפין את הסיסמאות לפני שמירה בDB ע’'י Hash, בשביל שבמידה והוא יפרץ לא יוכלו לעשות שימוש בסיסמאות לכניסה לאתרים אחרים (במידה והמשתמש בחר את אותה הסיסמה לאתר אחר).
האם יש עניין לפני שאני מבצע את ה-Hash לשרשר סטרינג נוסף לסיסמה של המשתמש??
קראתי בעבר שאמנם ההצפנות הללו הם חד כיווניות ואי אפשר לחזור אחורה באופן חישובי/מתמטי (וזה מוכח).
אבל יש שיטה להאקרים שעוברים על כל הסיסמאות האפשריות או הנפוצות ומצפינים אותם ובעצם יוצרים data base של סיסמאות לפני ואחרי הצפנה,
ובצורה הזו הם יכולים לחפש את הסיסמה המוצפנת בDB שלהם ולהחזיר אותה אחורה.
שירשור של סטרינג נוסף לסיסמה מסבך בשבילם את העניין מאוד.
האם זה נכון עדיין, או שבספריות ה-Hash הקיימות, כבר יש להם פיתרון גם לזה?
תודה
הדוגמא אומנם ב Node.JS אבל שווה להעיף מבט גם אם אתה עובד בסביבות אחרות.
בגדול יש שני דברים שאתה צריך לפחד מהם - הראשון כמו שכתבת זה שמישהו מחשב Hash על כל המילים בשפה (או מאיזשהו מילון) וככה יבנה לעצמו בסיס נתונים גדול של כל הסיסמאות האפשרויות והייצוג שלהן אצלך במאגר. בסיס נתונים כזה נקרא Rainbow Table ואנשים כבר בנו כאלה ואתה יכול למצוא אותם להורדה בחינם למשל מכאן: http://project-rainbowcrack.com/table.htm
נגד זה אנחנו משתמשים בטכניקה שנקראת Salting שאומרת שליד הסיסמא אנחנו שומרים גם טקסט אקראי כלשהו (שנקרא Salt) כדי להאריך את הסיסמא לפני ביצוע ה Hash. אם ה Salt מספיק ארוך אז החיבור ״סיסמא + מלח״ יוצא ייחודי ואז הוא לא מופיע באף מאגר סיסמאות ברשת.
הדבר השני שאתה פוחד ממנו זה שאותו אחד שפרץ ולקח את כל הסיסמאות ייקח גם את ה Salt-ים שלך ויבנה Rainbow Table ספציפי עבור האתר שלך. כנגד זה יש טכניקה שעושים Hash כמה פעמים (באזור ה 10,000 פעמים) על כל סיסמא לפני ששומרים אותה. ככה מי שינסה לבנות מאגר צריך לעבוד הרבה יותר קשה.
היום יש סיפריות מוכנות כמעט לכל שפת תכנות שעושות את שני הדברים בשבילך. המנגנון המומלץ היום שמשלב את שני הדברים נקרא ארגון2 ורצוי לקרוא עליו בויקיפדיה: