שלח תשובה

זירת השאלות

932
צפיות
28
תשובות

הצפנה

,‏ 7 באוקטובר, 2004

שלום לכולם!
עשיתי חיפוש בפורומים לגבי "הצפנה" ומצאתי את הקישור הבא:
https://www.webmaster.org.il/forums/Message.asp?Id=18639
באחד התגובות טל הציע להחליף כל אות לאות שאחריה…
רציתי לשאול איפה עושים את ההחלפה? בצד השרת, כלומר אחרי שהנתונים נשלחו? או בצד הלקוח דרך JS?


תודה וחג שמח,
אלברט

תגיות:

28 תשובות

  1. n0p הגיב:

    הצפנות – ידע כללי
    אני לא ממליץ להשתמש בהצפנות פשוטות, אבל זה תלוי מאוד בתוכן ה- Plaintext (הטקסט שלפני ההצפנה).
    אם אתה מצפין סיסמאות לתוך דאטאבייס (דוגמה: יש לך מערכת כניסה לאתר שמשתמשת בשם משתמש וסיסמה) אני חייב לציין פיתרון שמצאתי לפני כמה שנים ברשת ומאוד אהבתי (סליחה, אני לא זוכר איפה…): לכתוב את ה- Hash של הסיסמה לדאטאבייס במקום סיסמה מוצפנת.
    Hash הוא סוג אלגוריתם, שמטרתו לשמור "טביעת אצבע" של הטקסט. אם אתה משתמש ב- PHP, וודאי תבין את הקוד הבא:
    $first = md5("password");
    $second = md5("password");
    if ($first == $second) {
      echo "שווה";
    } else {
      echo "לא שווה";
    }

    הפונקציה md5() היא פונקציה שהקלט שלה הוא טקסט והפלט שלה הוא MD5 של אותו הטקסט (MD5 הוא סוג Hash, למרות ש- SHA-256 ודומיו נחשבים לבטוחים יותר).
    התוצאה של הקוד הזה הוא "לא שווה", דבר שלא יהיה נכון בכל הצפנה. חלק מההצפנות משתמשות ב- CBC Block לשיפור האבטחה (ההצפנה בוחרת תוספת למפתח של הצפנה בצורה רנדומאלית. חיפוש בגוגל יכול לעזור), ושימוש באותו מפתח, אותו ה- Plaintext ואותה ההצפנה יניב Ciphertext (טקסט מוצפן) שונה.
    בשטיה שהזכרתי קודם, כשהמשתמש נרשם לאתר הסיסמה שבחר לא נשמרת בדאטאבייס, אלא אותו פלט של ה-Hash. כשהמשתמש רוצה להתחבר לאתר, האפלקציה בודקת עם הפלט של אותו Hash שווה לתא המתאים בדאטאבייס.
    בצורה פשוטה ביותר, ב- PHP:
    function register($username, $password) {
      // After you connected the database…
      $query = mysql_query("INSERT INTO users (user, pass) VALUES ('" . $username . "', '" . md5($password) . ");");
      if ($query) {
        echo "You are registered.";
      } else {
        echo "Error: the sql query failed. Please [email protected]";
      }
      // Don't forget to close the connection!
    }

    function check_login($username, $password) {
      // After you connected the database…
      $query = mysql_query("SELECT * FROM users WHERE user = '" . $username . "' AND pass = '" . md5($password) . "';";
      if (mysql_num_rows($query) > 0) {
        // Welcome! You're in.
      } else {
        // Nope.
      }
      // Close the connection
    }

    דרך אגב, היתרונות המרכזיים בשיטה זו הם שהשיטה היא פשוטה לשימוש (בקוד), ואם פורצים לדאטאבייס אי אפשר לדעת את הסיסמה. אם כבר מדברים על אבטחה, ניתן לשים לב שדיברתי רק על "טביעת אצבע" של הטקסט, ולא הצפנה באמת. זאת אומרת, שלכמה סיסמאות תיהיה אותה "טביעת אצבע" – דבר שעלול להווה סיכון. אין מה לדאוג – הסבירות שלכמה סיסמאות תיהיה אותה "טביעת אצבע" היא קטנה מאוד. אפשר להשתמש בשיטה הזאת ללא חשש. אם בכל זאת רוצים אבטחה חזקה יותר, מומלץ להשתמש ב- SHA-512 (שמחזיר "טביעת אצבע" באורך של 512 תווים).

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

    מידע נוסף:
    http://csrc.ncsl.nist.gov/CryptoToolkit/ – האתר של ממשלת ארה"ב בנושא.
    http://www.zone-h.com/en/download/category=33 – כולל כמה מאמרים בנושא. לצערי יש שם כמה הצפנות פשוטות מידי, כך שמומלץ להיזהר לפני שמשתמשים בהם.

    מקווה שעזרתי

  2. jonatan44 הגיב:

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

  3. MasterMind הגיב:

    אתה יכול לקחת את הסיסמא
    להכפיל אותה ב 2 ולחלק אותה בגיל של אותו אדם
    ככה זה לעולם לא יהיה אותו הדבר כי סיסמאות הם שונות וגם תאריכי לידה הם שונים
    מה הסיכויים ששני אנשים בעלי תאריכי לידה דומים יקישו את אותה הסיסמא
    כמעט אפסי
    אז לך בכיוון הזה
    ושאלה לי אליך N0P יש את השיטה הזאת גם בASP  (אני מדבר על MD5)?

  4. n0p הגיב:

    שיפור ה- MD5
    אוקיי ראיתי שכמה אנשים התעניינו אז הינה המשך:
    כמו ש- jonatan44 אמר, לא מומלץ להשתמש ב- MD5 בלבד. אפשר לבנות פונקציה יותר חזקה, לדוגמה:
    function gethash($str) {
      return md5("asdf" . $str);
    }

    ההאקר הממוצע יחשוב שזה MD5, אבל זה לא ממש יעזור לא, כי זה לא MD5 "רגיל" של הסיסמה. תחשבו על דרכים לייעל את הפונקציה gethash לאתר שלכם – אחרי הכל, אם אנשים אחרים יודעים את הקוד, יותר קל להם לפרוץ אותו… אפשר, לדוגמה, לקחת את התו הראשון בסיסמה ולהוסיף אותו בסוף הסיסמה. תיהיו יצירתיים!

  5. albert הגיב:

    לא ממש הבנתי:
    א. תודה רבה רבה!
    ב. אם אתה יכול להסביר את המושגים שהזכרת בתשובה שלך… כי אני ממש מתחיל בנושא ולא מבין כלום בזה…
    ובטח שאני ובטוח עוד הרבה אנשים, ישמחו אם שתכתוב מאמר מעמיק בנושא..

    תודה,
    אלברט

  6. albert הגיב:

    איך אתה יכול לקחת טקסט ולהכפיל ב-2?
    או שאתה מדבר על אפשרות בה הסיסמא היא רק מספר?

  7. MasterMind הגיב:

    לגבי השיחזור של הקוד המוצפן
    אתה לא משחזר אותו כי זה בעייתי יותר
    אתה משנה את הסיסמא שהוכנסה לפי אלגוריתם ההצפנה שלך
    ואז אתה בודק אם הם שוות ….
    הכי קל (כמעט ) שבעולם

  8. albert הגיב:

    יש פונק' לכך?
    או שאני צריך לכתוב ריפלייס לכל האותיות הקיימות(בעברית ובאנגלית)..?

  9. n0p הגיב:

    הסבר פשוט
    יש סוג אלגוריתם שנקרא Hash. האלגוריתמים מסוג זה מקבלים טקסט ופולטים רצף של מספרים (ברך כלל Hex) שנותנת מידע מסוים על הטקסט, אבל לא הטקסט בשלמותו.

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

    למי שעד עכשיו לא קלט:
    נגיד שהקלט של האלגוריתם הוא 1. האלגוריתם מחזיר את הפלט "7f93a7ed62" בכל פעם שהאלגוריתם מקבל את הערך 1 (ודומיו). אז, אם בהרשמה לאתר הערך המוכנס לדאטאבייס הוא "7f93a7ed62" בכניסה לאתר אנו מצפים לערך שיהיה מתאים ל- "7f93a7ed62", זאת אומרת, אנחנו מצפים ל- 1 ודומיו. כשאנחנו מריצים שוב את האלגוריתם עם הערך 1, הערך שיתקבל הוא "7f93a7ed62". במידה עם הערך שהתקבל שווה לערך שקיים כבר בדאטאבייס, אז למשתמש יש את הערך את הסיסמה הנכונה (99.9% שזאת תיהיה הסיסמה הנכונה).

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

  10. ניר טייב הגיב:

    ב-VBS יש את הפונקציה ASC
    אני לא יודע מהי הפונקציה ההופכית שלה.

  11. n0p הגיב:

    כן, אבל רציתי שיהיה
    הסבר פשוט אבל מורחב…
    אני אוהב להעשיר כמה שיותר את המידע בעץ לחיפושים עתידיים (אידיאולוגיה פרטית, לא ניסיתי להעליב או משהו)

  12. albert הגיב:


    ההסבר מדהים אבל יכול להיות שעדין הראש שלי לא מסוגל לקלוט…
    כמה דברים:
    1) ערך Hex אמרת(ונדמה לי שאמור להיות) רק מספרים, לא? אז איך זה שיש גם אותיות בפלט?
    2) מה הכוונה מידה על טקסט בשפת העם?
    3) מה זא דומיו(במקרה שלנו "1")?
    תביט בבקשה על הקוד הבא(לקוח מהאתר php.net):

    <?php

    function get_rnd_iv($iv_len)
    {
       $iv = ";
       while ($iv_len– > 0) {
           $iv .= chr(mt_rand() & 0xff);
       }
       return $iv;
    }

    function md5_encrypt($plain_text, $password, $iv_len = 16)
    {
       $plain_text .= "x13";
       $n = strlen($plain_text);
       if ($n % 16) $plain_text .= str_repeat("", 16 – ($n % 16));
       $i = 0;
       $enc_text = get_rnd_iv($iv_len);
       $iv = substr($password ^ $enc_text, 0, 512);
       while ($i < $n) {
           $block = substr($plain_text, $i, 16) ^ pack('H*', md5($iv));
           $enc_text .= $block;
           $iv = substr($block . $iv, 0, 512) ^ $password;
           $i += 16;
       }
       return base64_encode($enc_text);
    }

    function md5_decrypt($enc_text, $password, $iv_len = 16)
    {
       $enc_text = base64_decode($enc_text);
       $n = strlen($enc_text);
       $i = $iv_len;
       $plain_text = ";
       $iv = substr($password ^ substr($enc_text, 0, $iv_len), 0, 512);
       while ($i < $n) {
           $block = substr($enc_text, $i, 16);
           $plain_text .= $block ^ pack('H*', md5($iv));
           $iv = substr($block . $iv, 0, 512) ^ $password;
           $i += 16;
       }
       return preg_replace('/\x13\x00*$/', ", $plain_text);
    }

    /******************************************/
    $plain_text = 'very secret string';
    $password = 'very secret password';
    echo "plain text is: [${plain_text}]<br />n";
    echo "password is: [${password}]<br />n";

    $enc_text = md5_encrypt($plain_text, $password);
    echo "encrypted text is: [${enc_text}]<br />n";

    $plain_text2 = md5_decrypt($enc_text, $password);
    echo "decrypted text is: [${plain_text2}]<br />n";

    ?>

    הקישור למסמך
    רציתי לדעת האם גם הפונקציה הזאת היא טובה לשימוש(כמובן שאפשר,ועשיתי, כמה שינויים כמו למשל: שינוי במספר ה- $iv_len).
    אבל משהו שלא הבנתי: אבל כל פעם הפונק' מחזירה משהו אחר בפלט למרות שהקלט הוא אותו דבר?

    תודה,
    אלברט

  13. ניר טייב הגיב:

    נראה לי שהכוונה ב-HEX היא
    הכוונה לבסיס 16 (מספרים מ0 עד 9 ומ-A עד F )

  14. albert הגיב:

    אה, וואלה…
    תודה
    מה עם השאלות האחרות?

  15. n0p הגיב:

    זאת הצפנה
    מבוססת על MD5. לשיפור האבטחה, הם משתמשים במספר רנדומאלי, ולכן כל פעם שמצפינים התוצאה היא שונה – וזה לא מה שהתכוונתי.

    הפונקציה md5() ב- PHP יוצרת Hash לקלט שלה.

    ב- Hash אותו קלט תמיד יניב אותו פלט. בהצפנה לא, וזה מה שקרה לך.

    השתמש בפונקציה המובנית md5() במקום.

    בעקבות העץ הזה אני אכתוב על השיטה הזאת מאמר בשבוע הקרוב. אם אתה עדיין לא מבין – חכה למאמר, והוא יסביר את הכל בצורה מסודרת.

  16. MasterMind הגיב:

    האם יש פונקצית MD5 ב ASP
    ב VB כי חיפשתי שעות בספרייה של MSDN ולא מצאתי כלום (הכול היה דוט נט)

    ואיזה מאמר אתה כותב ב ASP או PHP
    כי אני עכשיו עושה מאמר על הצפנות ב ASP (VB(

  17. ניר טייב הגיב:

    אין… אתה צריך לממש אותו בעצמך….
    אבל נראה לי שיש את זה באוביקט ASP Encrypte של persits

  18. n0p הגיב:

    אני אכתוב הסבר
    מרוכז של כל הדברים שעברו בעץ הזה.
    ואני לא מתכנת ASP אז אני אכתוב את המאמר ב- PHP.
    אם אתה רוצה אני יכולים לכתוב מאמר ביחד, עם קודים ב- PHP ו- ASP. אם כן צור איתי קשר n0p [AT] walla [DOT] com

    וד"א בילד נתן לינק לקוד ASP שעושה MD5

  19. albert הגיב:

    מאוד שמח שיצא משהו מהעץ הזה
    למרות שיש דברים שעדיין לא ממש ברורים לי, אבל אחכה למאמר…

    תודה רבה לכולכם,
    אלברט

שלח תשובה