932
צפיות
צפיות
28
תשובות
תשובות
הצפנה
שלום לכולם!
עשיתי חיפוש בפורומים לגבי "הצפנה" ומצאתי את הקישור הבא:
באחד התגובות טל הציע להחליף כל אות לאות שאחריה…
רציתי לשאול איפה עושים את ההחלפה? בצד השרת, כלומר אחרי שהנתונים נשלחו? או בצד הלקוח דרך JS?
תודה וחג שמח,
אלברט
28 תשובות
צד שרת…
תודה
הצפנות – ידע כללי
אני לא ממליץ להשתמש בהצפנות פשוטות, אבל זה תלוי מאוד בתוכן ה- 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 ולא על הצפנות, אך אני חייב לסיים עכשיו. אם יש ביקוש למאמר בנושא, אשמח לכתוב אחד.
מידע נוסף:
– האתר של ממשלת ארה"ב בנושא.
– כולל כמה מאמרים בנושא. לצערי יש שם כמה הצפנות פשוטות מידי, כך שמומלץ להיזהר לפני שמשתמשים בהם.
מקווה שעזרתי
יפוקק מחר, כמובן
אני מעדיף שלא להישתמש ב MD5 בילבד
אחרי הכול, זה שיטת הצפנה מוכרת לכל, תמיד אפשר להריץ מילון אשר יקודד את עצמו ולהשוות את הפלט לצופן.
מומלץ להכין פונקצית הצפנה עצמית, בנוסף ל MD5.
אתה יכול לקחת את הסיסמא
להכפיל אותה ב 2 ולחלק אותה בגיל של אותו אדם
ככה זה לעולם לא יהיה אותו הדבר כי סיסמאות הם שונות וגם תאריכי לידה הם שונים
מה הסיכויים ששני אנשים בעלי תאריכי לידה דומים יקישו את אותה הסיסמא
כמעט אפסי
אז לך בכיוון הזה
ושאלה לי אליך N0P יש את השיטה הזאת גם בASP (אני מדבר על MD5)?
MD5
שיפור ה- MD5
אוקיי ראיתי שכמה אנשים התעניינו אז הינה המשך:
כמו ש- jonatan44 אמר, לא מומלץ להשתמש ב- MD5 בלבד. אפשר לבנות פונקציה יותר חזקה, לדוגמה:
function gethash($str) {
return md5("asdf" . $str);
}
ההאקר הממוצע יחשוב שזה MD5, אבל זה לא ממש יעזור לא, כי זה לא MD5 "רגיל" של הסיסמה. תחשבו על דרכים לייעל את הפונקציה gethash לאתר שלכם – אחרי הכל, אם אנשים אחרים יודעים את הקוד, יותר קל להם לפרוץ אותו… אפשר, לדוגמה, לקחת את התו הראשון בסיסמה ולהוסיף אותו בסוף הסיסמה. תיהיו יצירתיים!
לא ממש הבנתי:
א. תודה רבה רבה!
ב. אם אתה יכול להסביר את המושגים שהזכרת בתשובה שלך… כי אני ממש מתחיל בנושא ולא מבין כלום בזה…
ובטח שאני ובטוח עוד הרבה אנשים, ישמחו אם שתכתוב מאמר מעמיק בנושא..
תודה,
אלברט
איך אתה יכול לקחת טקסט ולהכפיל ב-2?
או שאתה מדבר על אפשרות בה הסיסמא היא רק מספר?
ואיך משחזרים את הקוד מוצפן?
לגבי השיחזור של הקוד המוצפן
אתה לא משחזר אותו כי זה בעייתי יותר
אתה משנה את הסיסמא שהוכנסה לפי אלגוריתם ההצפנה שלך
ואז אתה בודק אם הם שוות ….
הכי קל (כמעט ) שבעולם
מעבירים ל-ASCII ואז מכפילים
יש פונק' לכך?
או שאני צריך לכתוב ריפלייס לכל האותיות הקיימות(בעברית ובאנגלית)..?
הסבר פשוט
יש סוג אלגוריתם שנקרא Hash. האלגוריתמים מסוג זה מקבלים טקסט ופולטים רצף של מספרים (ברך כלל Hex) שנותנת מידע מסוים על הטקסט, אבל לא הטקסט בשלמותו.
הינה מה שצריך לעשות:
בהרשמה: הסיסמה שנשמרת בדאטאבייס היא למעשה הפלט של האלגוריתם.
בכניסה לאתר: מכניסים את הסיסמה שהתקבלה מהמשתמש לתוך פונקציה כזו, בודקים אם השתיים שווים.
למי שעד עכשיו לא קלט:
נגיד שהקלט של האלגוריתם הוא 1. האלגוריתם מחזיר את הפלט "7f93a7ed62" בכל פעם שהאלגוריתם מקבל את הערך 1 (ודומיו). אז, אם בהרשמה לאתר הערך המוכנס לדאטאבייס הוא "7f93a7ed62" בכניסה לאתר אנו מצפים לערך שיהיה מתאים ל- "7f93a7ed62", זאת אומרת, אנחנו מצפים ל- 1 ודומיו. כשאנחנו מריצים שוב את האלגוריתם עם הערך 1, הערך שיתקבל הוא "7f93a7ed62". במידה עם הערך שהתקבל שווה לערך שקיים כבר בדאטאבייס, אז למשתמש יש את הערך את הסיסמה הנכונה (99.9% שזאת תיהיה הסיסמה הנכונה).
אם מישהו עדיין לא הבין, שיכתוב לי בדיוק איזה משפט/מילה הוא לא הבין ואני אסביר.
ב-VBS יש את הפונקציה ASC
אני לא יודע מהי הפונקציה ההופכית שלה.
נו זה מה אמרתי…
מה לא?
כן, אבל רציתי שיהיה
הסבר פשוט אבל מורחב…
אני אוהב להעשיר כמה שיותר את המידע בעץ לחיפושים עתידיים (אידיאולוגיה פרטית, לא ניסיתי להעליב או משהו)
Char או CHR (אני לא מתכנת ASP)
ההסבר מדהים אבל יכול להיות שעדין הראש שלי לא מסוגל לקלוט…
כמה דברים:
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("