linux下本地用戶認證機制的實現(php版)

絕大多數情況下,一款Web應用系統的用戶認證機制,最常見的實現方式,就是自定義用戶管理功能,該模塊是內嵌在web應用中,隨web應用一起發佈出去的。然而,對於一些特殊的應用,尤其是基於linux服務器的應用軟件,它們會經常使用linux本地的用戶認證機制,來實現用戶的認證功能。下面就來看一下在平時的開發過程中如何使用linux的本地用戶認證機制。
首先,明白一點,linux系統中,真正的用戶賬號信息是保存在/etc/shadow文件中,而不是/etc/passwd文件。
模擬場景如下:
用戶在打開的web登錄界面上輸入用戶名和密碼,提交後,後臺判斷該用戶名和密碼是否正確。
具體的實現步驟如下:
1. 獲取linux用戶信息
通過以下命令,獲取到某個指定用戶的密碼信息。
$sys_pwd= shell_exec('cat /etc/shadow|grep "user_name"| head -n 1|cut -d ":" -f2');
此處的user_name,就是用戶在web登錄界面上輸入的用戶名稱。
返回的結果$sys_pwd如果爲空,則表示該用戶不存在,反之,將會返回類似如下的信息:
$6$Lof/n6en$HlVk8g5sFW9Ip.AiyxhIWJshyanWwKA6uFkj2gbRCBF09AFomDXcSVxYf4pm0vQOzw33tTa8YERe2hYIcJNqE.
可以看到,這個字符串被美元符號$分割成了3段,每一段的含義如下:
第一段:salt類型,可選值有:1, 2a, 5, 6,此處是6
第二段:salt干擾值,此處是Lof/n6en
第三段:真正的密碼串,是linux利用crypt加密方式自動生成的
2. 密碼比對
將用戶在web登錄界面上輸入的密碼通過crypt加密後,檢查該加密結果與步驟1中拿到的密碼是否一致,如果一致,則匹配成功,反之,則說明用戶輸入的密碼是錯誤的。
if ($sys_pwd) {
	$result = explode('$', $sys_pwd);
	$pwd = encrypt($password,$result[2],strval($result[1]));
	if ($pwd == str_replace(chr(10), '', $result[3])) {
		echo '用戶認證成功';
	} else {
		echo '用戶認證失敗';
	}
}
代碼中的$password,表示用戶在web登錄界面上輸入的密碼。
附crypt函數如下:
/**
	 * 字符串加密
	 * @param string $str 待加密字符串
	 * @param string $salt salt干擾值
	 * @param string $salt_type salt類型,可選值有:1, 2a, 5, 6
	 * @return string
	 */
	function encrypt($str = null,$salt = null,$salt_type = null){
		$result = '';
		//密碼所在列
		$pwd_index = 0;
		switch ($salt_type) {
			case '1':
				$pwd_index = 3;
				if (CRYPT_MD5 == 1) {
					$result = crypt($str,'$1$'.$salt.'$');
				}
				break;
			case '2a':
				$pwd_index = 3;
				if (CRYPT_BLOWFISH == 1) {
					$result = crypt($str,'$2a$09$'.$salt.'$');
				}
				break;
			case '5':
				$pwd_index = 4;
				if (CRYPT_SHA256 == 1) {
					$result = crypt($str,'$5$rounds=5000$'.$salt.'$');
				}
				break;
			case '6':
				$pwd_index = 4;
				if (CRYPT_SHA512 == 1) {
					$result = crypt($str,'$6$rounds=5000$'.$salt.'$');
				}
				break;
			default:
				$result = $str;
				break;
		}
		if ($result) {
			$rs = explode('$', $result);
			return str_replace(chr(10), '', $rs[$pwd_index]);
		}
		return $result;
	}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章