דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. נוד bcrypt עם מלח משלי

נוד bcrypt עם מלח משלי

מתוזמן נעוץ נעול הועבר תכנות
8 פוסטים 3 כותבים 196 צפיות 2 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD מנותק
    dovidD מנותק
    dovid
    ניהול
    כתב ב נערך לאחרונה על ידי
    #1

    אני מנסה להשתמש בספריית bcrypt לנוד,
    ואני רואה שבמתודה bcrypt.hash יש שני פרמטרים, קלט ומלח שהוא מייצר (salt).
    אני רוצה לספק לו מלח משלי, כדי לפשט את השליפה מהמסד נתונים, זה אפשרי?

    • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
    • בכל נושא אפשר ליצור קשר dovid@tchumim.com
    yossizY תגובה 1 תגובה אחרונה
    0
    • dovidD dovid

      אני מנסה להשתמש בספריית bcrypt לנוד,
      ואני רואה שבמתודה bcrypt.hash יש שני פרמטרים, קלט ומלח שהוא מייצר (salt).
      אני רוצה לספק לו מלח משלי, כדי לפשט את השליפה מהמסד נתונים, זה אפשרי?

      yossizY מנותק
      yossizY מנותק
      yossiz
      כתב ב נערך לאחרונה על ידי
      #2

      @dovid לפי התיעוד הפוקנציה מקבלת מספר או מחרוזת, אם תתן לו מחרוזת הוא יקח את זה כמלח.

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

      dovidD תגובה 1 תגובה אחרונה
      1
      • yossizY yossiz

        @dovid לפי התיעוד הפוקנציה מקבלת מספר או מחרוזת, אם תתן לו מחרוזת הוא יקח את זה כמלח.

        dovidD מנותק
        dovidD מנותק
        dovid
        ניהול
        כתב ב נערך לאחרונה על ידי dovid
        #3

        @yossiz תודה, ניסיתי ככה בהתחלה וזה נתן לי שגיאה (גירסת מלח לא חוקית), וכעת הבנתי שיש פורמט מיוחד למלח:

         $2a$10$XYZ
        

        ההתחלה $2a זה שיטת ההמלחה וזה היה חסר במלח שסיפקתי (זה היה המייל של האדם בעל הסיסמה). ההמשך $10 זה מספר המעברים/ערבולים כנראה, ואחרי זה הטקסט החופשי שלי.

        • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
        • בכל נושא אפשר ליצור קשר dovid@tchumim.com
        תגובה 1 תגובה אחרונה
        3
        • ח מנותק
          ח מנותק
          חוקר
          כתב ב נערך לאחרונה על ידי
          #4

          @dovid אמר בנוד bcrypt עם מלח משלי:

          אני רוצה לספק לו מלח משלי, כדי לפשט את השליפה מהמסד נתונים, זה אפשרי?

          אני לא כ"כ מכיר איך זה עובד אני רק יודע שאצלי ב JWT זה ממומש כך
          password: bcrypt.hashSync(req.body.password, 8)
          מעניין להבין מה אתה רוצה להרוויח

          dovidD תגובה 1 תגובה אחרונה
          1
          • ח חוקר

            @dovid אמר בנוד bcrypt עם מלח משלי:

            אני רוצה לספק לו מלח משלי, כדי לפשט את השליפה מהמסד נתונים, זה אפשרי?

            אני לא כ"כ מכיר איך זה עובד אני רק יודע שאצלי ב JWT זה ממומש כך
            password: bcrypt.hashSync(req.body.password, 8)
            מעניין להבין מה אתה רוצה להרוויח

            dovidD מנותק
            dovidD מנותק
            dovid
            ניהול
            כתב ב נערך לאחרונה על ידי
            #5

            @חוקר אני שומר את הגיבוב במסד הנתונים.
            בעת ניסיון כניסה אני רוצה לבדוק שזה אכן הסיסמה, אז אני מייצר שוב את הגיבוב, ובודק אם זה מה שיש במסד.
            משום מה יש לי רושם שאני היחיד בגלובוס שעושה ככה, ואני לא מבין איפה אני טועה.
            המייל לא עובד לי כמלח כי צריך מחרוזת של base64 באורך קבוע. אני ממש לא מבין מה, אני בעצם יכול לעשות בלי מלח ולצרף את המייל לסוף הסיסמה כמלח נגד טבלאות סיסמאות.

            • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
            • בכל נושא אפשר ליצור קשר dovid@tchumim.com
            dovidD ח 2 תגובות תגובה אחרונה
            2
            • dovidD dovid

              @חוקר אני שומר את הגיבוב במסד הנתונים.
              בעת ניסיון כניסה אני רוצה לבדוק שזה אכן הסיסמה, אז אני מייצר שוב את הגיבוב, ובודק אם זה מה שיש במסד.
              משום מה יש לי רושם שאני היחיד בגלובוס שעושה ככה, ואני לא מבין איפה אני טועה.
              המייל לא עובד לי כמלח כי צריך מחרוזת של base64 באורך קבוע. אני ממש לא מבין מה, אני בעצם יכול לעשות בלי מלח ולצרף את המייל לסוף הסיסמה כמלח נגד טבלאות סיסמאות.

              dovidD מנותק
              dovidD מנותק
              dovid
              ניהול
              כתב ב נערך לאחרונה על ידי
              #6

              סליחה, אני משום מה לא רציתי לבקש מהמסד את המשתמש אלא רק לשאול האם קיים.
              ולכן בראש שלי לשלוף את הגיבוב היה גורם לשאילתה כפולה.
              כעת אני מבין מה שכולם עושים, שולפים את המשתמש בכל מקרה לפי המייל/מזהה ובודקים אחרי זה את הסיסמה עם הגיבוב השמור שנשלף.

              • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
              • בכל נושא אפשר ליצור קשר dovid@tchumim.com
              תגובה 1 תגובה אחרונה
              3
              • dovidD dovid

                @חוקר אני שומר את הגיבוב במסד הנתונים.
                בעת ניסיון כניסה אני רוצה לבדוק שזה אכן הסיסמה, אז אני מייצר שוב את הגיבוב, ובודק אם זה מה שיש במסד.
                משום מה יש לי רושם שאני היחיד בגלובוס שעושה ככה, ואני לא מבין איפה אני טועה.
                המייל לא עובד לי כמלח כי צריך מחרוזת של base64 באורך קבוע. אני ממש לא מבין מה, אני בעצם יכול לעשות בלי מלח ולצרף את המייל לסוף הסיסמה כמלח נגד טבלאות סיסמאות.

                ח מנותק
                ח מנותק
                חוקר
                כתב ב נערך לאחרונה על ידי חוקר
                #7

                @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 });
                        });
                };
                
                dovidD תגובה 1 תגובה אחרונה
                2
                • ח חוקר

                  @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 });
                          });
                  };
                  
                  dovidD מנותק
                  dovidD מנותק
                  dovid
                  ניהול
                  כתב ב נערך לאחרונה על ידי dovid
                  #8

                  @חוקר אמר בנוד bcrypt עם מלח משלי:

                  ראשית כל שולפים מהבסיס נתונים את המשתמש העונה למייל המבוקש, ואח"כ משווים את הסיסמא עם פונקציה יעודית.

                  זה מה שהבנתי בסוף שכולם עושים.
                  אני רציתי להימנע מלשלוף מהDB במידה וזה לא הסיסמה הנכונה, כלומר חיסכון עבודה של השרת עבור נסיונות פריצה. בשביל זה כללתי בwhere עצמו שהסיסמה נכונה (בשביל זה אני חייב לייצר בדיוק את אותו גיבוב שוב כדי להשוות מחרוזות בלי הפונקציה ייעודית של compare), אז אם זה שגוי חוזר אפס תוצאות שזה יחידת עבודה פחות גדולה. קשקושים של חיפוש שלמות מיותרת.

                  • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                  • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                  תגובה 1 תגובה אחרונה
                  3
                  תגובה
                  • תגובה כנושא
                  התחברו כדי לפרסם תגובה
                  • מהישן לחדש
                  • מהחדש לישן
                  • הכי הרבה הצבעות


                  בא תתחבר לדף היומי!
                  • התחברות

                  • אין לך חשבון עדיין? הרשמה

                  • התחברו או הירשמו כדי לחפש.
                  • פוסט ראשון
                    פוסט אחרון
                  0
                  • דף הבית
                  • קטגוריות
                  • פוסטים אחרונים
                  • משתמשים
                  • חיפוש
                  • חוקי הפורום