נוד bcrypt עם מלח משלי
-
@yossiz תודה, ניסיתי ככה בהתחלה וזה נתן לי שגיאה (גירסת מלח לא חוקית), וכעת הבנתי שיש פורמט מיוחד למלח:
$2a$10$XYZ
ההתחלה $2a זה שיטת ההמלחה וזה היה חסר במלח שסיפקתי (זה היה המייל של האדם בעל הסיסמה). ההמשך $10 זה מספר המעברים/ערבולים כנראה, ואחרי זה הטקסט החופשי שלי.
-
@dovid אמר בנוד bcrypt עם מלח משלי:
אני רוצה לספק לו מלח משלי, כדי לפשט את השליפה מהמסד נתונים, זה אפשרי?
אני לא כ"כ מכיר איך זה עובד אני רק יודע שאצלי ב JWT זה ממומש כך
password: bcrypt.hashSync(req.body.password, 8)
מעניין להבין מה אתה רוצה להרוויח -
@חוקר אני שומר את הגיבוב במסד הנתונים.
בעת ניסיון כניסה אני רוצה לבדוק שזה אכן הסיסמה, אז אני מייצר שוב את הגיבוב, ובודק אם זה מה שיש במסד.
משום מה יש לי רושם שאני היחיד בגלובוס שעושה ככה, ואני לא מבין איפה אני טועה.
המייל לא עובד לי כמלח כי צריך מחרוזת של base64 באורך קבוע. אני ממש לא מבין מה, אני בעצם יכול לעשות בלי מלח ולצרף את המייל לסוף הסיסמה כמלח נגד טבלאות סיסמאות. -
סליחה, אני משום מה לא רציתי לבקש מהמסד את המשתמש אלא רק לשאול האם קיים.
ולכן בראש שלי לשלוף את הגיבוב היה גורם לשאילתה כפולה.
כעת אני מבין מה שכולם עושים, שולפים את המשתמש בכל מקרה לפי המייל/מזהה ובודקים אחרי זה את הסיסמה עם הגיבוב השמור שנשלף. -
@dovid אמר בנוד bcrypt עם מלח משלי:
בעת ניסיון כניסה אני רוצה לבדוק שזה אכן הסיסמה
אצלי ה signIn עובד כך, הרי אני דורש ממי שמזדהה כתובת מייל (או שם משתמש) וסיסמא.
ראשית כל שולפים מהבסיס נתונים את המשתמש העונה למייל המבוקש, ואח"כ משווים את הסיסמא עם פונקציה יעודית.
(אח"כ אני נותן טוקן jwt)exports.signin = (req, res) => { User.findOne({ where: { username: req.body.username } }) .then(user => { if (!user) { return res.status(404).send({ message: "משתמש לא נמצא." }); } if (user.status) { //משתמשים חסומים וכדומה return res.status(403).send({ message: user.status }); } var passwordIsValid = bcrypt.compareSync( req.body.password, user.password ); if (!passwordIsValid) { return res.status(401).send({ accessToken: null, message: "סיסמא שגויה!" }); } let expiresIn = 86400; if (req.body.rememberMe){ expiresIn = 86400 * 365; } var token = jwt.sign({ id: user.id }, config.secret, { expiresIn: expiresIn // 24 hours }); var authorities = []; var ability = [{ "action": 'read', "subject": 'Auth' }]; user.getRoles().then(async roles => { for (let i = 0; i < roles.length; i++) { authorities.push("ROLE_" + roles[i].name.toUpperCase()); } roles.sort((a, b) => (a.roleId < b.roleId) ? 1 : 0); let max = roles[0]; for (let i = 0; i <= ROLES.indexOf(max.name); i++) { ability.push({ "action": 'manage', "subject": ROLES[i] }); } res.status(200).send({ accessToken: token, "userData": { id: user.id, "fullName": user.username, username: user.username, "avatar": "/img/13-small.d796bffd.png", email: user.email, "role": "admin", roles: authorities, "ability": ability, }, "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.dfsgdffhd.gghdfjhgjnjyue576uyjd" }) }); }) .catch(err => { res.status(500).send({ message: err.message }); }); };
-
@חוקר אמר בנוד bcrypt עם מלח משלי:
ראשית כל שולפים מהבסיס נתונים את המשתמש העונה למייל המבוקש, ואח"כ משווים את הסיסמא עם פונקציה יעודית.
זה מה שהבנתי בסוף שכולם עושים.
אני רציתי להימנע מלשלוף מהDB במידה וזה לא הסיסמה הנכונה, כלומר חיסכון עבודה של השרת עבור נסיונות פריצה. בשביל זה כללתי בwhere עצמו שהסיסמה נכונה (בשביל זה אני חייב לייצר בדיוק את אותו גיבוב שוב כדי להשוות מחרוזות בלי הפונקציה ייעודית של compare), אז אם זה שגוי חוזר אפס תוצאות שזה יחידת עבודה פחות גדולה. קשקושים של חיפוש שלמות מיותרת.