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

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

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

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

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

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

    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

    בכל נושא אפשר ליצור קשר dovid@tchumim.com

    yossizY תגובה 1 תגובה אחרונה
    0
    • yossizY מחובר
      yossizY מחובר
      yossiz
      השיב לdovid ב נערך לאחרונה על ידי
      #2

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

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

      dovidD תגובה 1 תגובה אחרונה
      1
      • dovidD מנותק
        dovidD מנותק
        dovid ניהול
        השיב לyossiz ב נערך לאחרונה על ידי 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
          • dovidD מנותק
            dovidD מנותק
            dovid ניהול
            השיב לחוקר ב נערך לאחרונה על ידי
            #5

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

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            dovidD ח 2 תגובות תגובה אחרונה
            2
            • dovidD מנותק
              dovidD מנותק
              dovid ניהול
              השיב לdovid ב נערך לאחרונה על ידי
              #6

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

              מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

              בכל נושא אפשר ליצור קשר dovid@tchumim.com

              תגובה 1 תגובה אחרונה
              3
              • ח מנותק
                ח מנותק
                חוקר
                השיב לdovid ב נערך לאחרונה על ידי חוקר
                #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
                • dovidD מנותק
                  dovidD מנותק
                  dovid ניהול
                  השיב לחוקר ב נערך לאחרונה על ידי dovid
                  #8

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

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

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

                  מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                  בכל נושא אפשר ליצור קשר dovid@tchumim.com

                  תגובה 1 תגובה אחרונה
                  3

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

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

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