נוד bcrypt עם מלח משלי
-
אני מנסה להשתמש בספריית bcrypt לנוד,
ואני רואה שבמתודה bcrypt.hash יש שני פרמטרים, קלט ומלח שהוא מייצר (salt).
אני רוצה לספק לו מלח משלי, כדי לפשט את השליפה מהמסד נתונים, זה אפשרי? -
@yossiz תודה, ניסיתי ככה בהתחלה וזה נתן לי שגיאה (גירסת מלח לא חוקית), וכעת הבנתי שיש פורמט מיוחד למלח:
$2a$10$XYZ
ההתחלה $2a זה שיטת ההמלחה וזה היה חסר במלח שסיפקתי (זה היה המייל של האדם בעל הסיסמה). ההמשך $10 זה מספר המעברים/ערבולים כנראה, ואחרי זה הטקסט החופשי שלי.
-
@dovid אמר בנוד bcrypt עם מלח משלי:
אני רוצה לספק לו מלח משלי, כדי לפשט את השליפה מהמסד נתונים, זה אפשרי?
אני לא כ"כ מכיר איך זה עובד אני רק יודע שאצלי ב JWT זה ממומש כך
password: bcrypt.hashSync(req.body.password, 8)
מעניין להבין מה אתה רוצה להרוויח -
@dovid אמר בנוד bcrypt עם מלח משלי:
אני רוצה לספק לו מלח משלי, כדי לפשט את השליפה מהמסד נתונים, זה אפשרי?
אני לא כ"כ מכיר איך זה עובד אני רק יודע שאצלי ב JWT זה ממומש כך
password: bcrypt.hashSync(req.body.password, 8)
מעניין להבין מה אתה רוצה להרוויח@חוקר אני שומר את הגיבוב במסד הנתונים.
בעת ניסיון כניסה אני רוצה לבדוק שזה אכן הסיסמה, אז אני מייצר שוב את הגיבוב, ובודק אם זה מה שיש במסד.
משום מה יש לי רושם שאני היחיד בגלובוס שעושה ככה, ואני לא מבין איפה אני טועה.
המייל לא עובד לי כמלח כי צריך מחרוזת של base64 באורך קבוע. אני ממש לא מבין מה, אני בעצם יכול לעשות בלי מלח ולצרף את המייל לסוף הסיסמה כמלח נגד טבלאות סיסמאות. -
@חוקר אני שומר את הגיבוב במסד הנתונים.
בעת ניסיון כניסה אני רוצה לבדוק שזה אכן הסיסמה, אז אני מייצר שוב את הגיבוב, ובודק אם זה מה שיש במסד.
משום מה יש לי רושם שאני היחיד בגלובוס שעושה ככה, ואני לא מבין איפה אני טועה.
המייל לא עובד לי כמלח כי צריך מחרוזת של base64 באורך קבוע. אני ממש לא מבין מה, אני בעצם יכול לעשות בלי מלח ולצרף את המייל לסוף הסיסמה כמלח נגד טבלאות סיסמאות. -
@חוקר אני שומר את הגיבוב במסד הנתונים.
בעת ניסיון כניסה אני רוצה לבדוק שזה אכן הסיסמה, אז אני מייצר שוב את הגיבוב, ובודק אם זה מה שיש במסד.
משום מה יש לי רושם שאני היחיד בגלובוס שעושה ככה, ואני לא מבין איפה אני טועה.
המייל לא עובד לי כמלח כי צריך מחרוזת של 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 }); }); };
-
@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), אז אם זה שגוי חוזר אפס תוצאות שזה יחידת עבודה פחות גדולה. קשקושים של חיפוש שלמות מיותרת.