php / המדריך לקידוד מידע / השימוש בפונקצית crypt()

שיעור 2


השימוש בפונקצית ()crypt


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

פונקצית ()crypt בנויה ישירות בתוך PHP, כך ששום ספריה נוספת לא נדרשת.
במערכות חלונות עליך לדאוג ש php*_crypt.dll יותקן כראוי ויזוהה בקובץ php*.ini שלך.

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

מה? "עוקץ" הוא פיסת מידע בה אנו משתמשים כדי ליצור אלגוריתם סטנדרטי של DES.העוקץ של מחרוזת שהוצפנה בDES ימצא בשני הסימנים הראשונים של הקובץ שיתקבל בסוף. העובדה הזו חשובה מאוד - תמשיך לקרוא כדי להבין למה.

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

joe:WvzodahMR9Usk
jane:g3RYjX5evEvdM
julie:YzASzTGEo2VMA


עכשיו, ברור לכולנו ש "WvzodahMR9USk" זו לא ממש הסיסמא של ג'ו.
הסיסמא האמיתית שלו היא בעצם "abba001,", אבל אחרי הצפנה, היא תיראה כמו
"WvzodahMR9Usk העוקץ שמאפיין את הסיסמא של ג'ו ויקשר בינו לבין הDES הוא "WV" בדיוק באותה מידה שהעוקץ של ג'ין הוא "G3" ושל ג'ולי "YZ".
כאשר אתה יודע מה העוקץ, אתה יכול לבצע השוואת סיסמאות.

אתה יכול להשתמש בקובץ קיים של htpasswd עם מערכת הזיהוי מבוססת הPHP שלך ע"י שימוש בשילוב של הפונקציות ()substr ו- () crypt כדי להשוות בין המידע שהוכנס ע"י המשתמש ב PHP_AUTH_PW$ ובין שורה קיימת בקובץ htpasswd.

לדוגמא, בואו נשנה סקריפט הלקוח ממאמר אחר - אימות ומעקב אחרי משתמשים עם .PHP ונשתמש בו בתור קובץ htpasswd

כדי להתחיל כמו שצריך, עליך להשתמש ב-()isset כדי לבדוק אם ישנו ערך בתוך PHP_AUTH_USER$ ולהציג תיבת דיאלוג של שם משתמש וסיסמא אם אין שום ערך.

if (!isset($PHP_AUTH_USER)) {

header('WWW-Authenticate: Basic realm="Private"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;

}


אם ישנו ערך בתוך PHP_AUTH_USER$, פתח את קובץ htpasswd וקרא את תוכנו אל תוך משתנה בשם file_contents$ אחר כך הפרד את המחרוזת לנתונים, כך שיהיה אפשר לעשות שימוש בנתונים והכנס כל צמד של שם משתמש / סיסמא לתוך תא במערך($line). עבור על כל שורה במערך והפרד את שמות המשתמשים לאלמנט אחד במערך ואת הסיסמאות לאלמנט שני.

else if (isset($PHP_AUTH_USER)) {

$filename = "/path/to/.htpasswd";
$fp = fopen($filename, "r");
$file_contents = fread($fp, filesize($filename));
fclose($fp);

// Place each line in user info file into an array

$line = explode("\n", $file_contents);

// For as long as $i is <= the size of the $line array,
// explode each array element into a username and password
// pair and attempt to match to $PHP_AUTH_USER and
// $PHP_AUTH_PW values

$i = 0;

while($i <= sizeof($line)) {
$data_pair = explode(":", $line[$i]);



עכשיו, קח את הערך של PHP_AUTH_USER$ ונסה למצוא התאמה עם $data_pair[0] (שם המשתמש ב htpasswd).אם מצאת התאמה, השתמש ב-( )substr כדי לחתוך את שני הסימנים הראשונים במחרוזת (העוקץ) של הכניסה המקבילה המכילה את הסיסמא של המשתמש ($data_pair[1]). אחר כך השתמש בפונקצית ()crypt כדי להצפין את PHP_AUTH_PW$ ע"י העוקץ שרק מצאת.


if ($data_pair[0] == "$PHP_AUTH_USER") {

// get salt from $data_pair[1]
$salt = substr($data_pair[1], 0, 2);

// encrypt $PHP_AUTH_PW based on $salt
$enc_pw = crypt($PHP_AUTH_PW, $salt);


קח את הערך שהתקבל ב-enc_pw$ ובדוק אם הוא תואם את הסיסמא שנמצאת בקובץ htpasswd ($data_pair[1]). אם נמצאה התאמה, הכנס את הערך "1" למשתנה בשם auth$ ושבור את הלולאה. אם לא נמצאה התאמה, הכנס למשתנה את הערך "0" והמשך את הלוף.

// try to match encrypted passwords
if ($data_pair[1] == "$enc_pw") {

$auth = 1;
break;

} else {

$auth = 0;

}

} else {

$auth = 0;

}

$i++;

}


אחרי שהלולאה סיימה לרוץ, השתמש בערך הנמצא ב-auth$ כדי להציג תיבת דיאלוג מחדש או לתת למשתמש לקרוא את המידע הסודי (אם יש לו אישור לכך).

// check value of $auth

if ($auth == "1) {

echo "You're authorized! </p";

} else {

header('WWW-Authenticate: Basic realm="Private"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;

}
}


מהתחלה לסוף, הסקריפט יראה ככה:

<?

if (!isset($PHP_AUTH_USER)) {

header('WWW-Authenticate: Basic realm="Private"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;

} else if (isset($PHP_AUTH_USER)) {

$filename = "/path/to/.htpasswd";
$fp = fopen($filename, "r");
$file_contents = fread($fp, filesize($filename));
fclose($fp);

// Place each line in user info file into an array

$line = explode("\n", $file_contents);

// For as long as $i is <= the size of the $line array,
// explode each array element into a username and password // pair and attempt to match to $PHP_AUTH_USER and
// $PHP_AUTH_PW values

$i = 0;

while($i <= sizeof($line)) {
$data_pair = explode(":", $line[$i]);

if ($data_pair[0] == "$PHP_AUTH_USER") {

// get salt from $data_pair[1]
$salt = substr($data_pair[1], 0, 2);

// encrypt $PHP_AUTH_PW based on $salt
$enc_pw = crypt($PHP_AUTH_PW, $salt);

// try to match encrypted passwords
if ($data_pair[1] == "$enc_pw") {

$auth = 1;
break;

} else {

$auth = 0;

}

} else {

$auth = 0;

}

$i++;

}

// check value of $auth

if ($auth == "1") {

echo "You're authorized!

";

} else {

header('WWW-Authenticate: Basic
realm="Private"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;

}

}

?>


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

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



עמוד הבא: שימוש בספרית mcrypt >>




הקדמה
שעור 1
הקדמה
צופן המבוסס על מפתחות
פרטיים וציבוריים

מתחילים עם PGP
מתחילים עם GnuPG
הקריאה למקודד המפתח
הציבורי

שעור 2
קידוד חד צדדי ו HASH
השמוש בפונקצית crypt >
שמוש בספרית mcrypt