1. 程式人生 > >wordpress密碼生成與登入密碼驗證

wordpress密碼生成與登入密碼驗證

一。研究wordpress時wordpess的密碼密碼生成與登入密碼驗證方式很重要

WordPress密碼已成為整合的首要目標,如何征服整合,就得了解WordPress密碼演算法。

WordPress系統的使用者密碼是儲存在wp_users資料表的user_pass欄位,密碼是通過Portable PHP password hashing framework類產生的,密碼的形式是隨機且不可逆,同一個明文的密碼在不同時間,產生的密文也不一樣,相對來說較為安全。

二。密碼生成方式

> 隨機產生一個salt 並將salt和password相加
> 進行了count次md5 然後和encode64的hash數值累加


> 最後得到一個以$P$開頭的密碼,這個密碼每次產生的結果都不一樣

以下為在wordpress中呼叫密碼生成的程式碼

<?php
 $password = 'abc';
 global $wp_hasher;
 if ( empty($wp_hasher) ) {
  require_once( './wp-includes/class-phpass.php');
  $wp_hasher = new PasswordHash(8, TRUE);
 }
 echo $wp_hasher->HashPassword($password);
?>


三。wordpress密碼生成與登入驗證

wordpress中位置為\wp-includes\class-phpass.php

以下是wordpress中生成密碼的程式碼直接執行可檢視密碼的生成以及驗證過程

<?php

class PasswordHash {
	var $itoa64;
	var $iteration_count_log2;
	var $portable_hashes;
	var $random_state;

	function PasswordHash($iteration_count_log2, $portable_hashes)
	{
		$this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

		if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)
			$iteration_count_log2 = 8;
		$this->iteration_count_log2 = $iteration_count_log2;

		$this->portable_hashes = $portable_hashes;

		$this->random_state = microtime() . uniqid(rand(), TRUE); // removed getmypid() for compability reasons
	}

	function get_random_bytes($count)
	{
		$output = '';
		if ( @is_readable('/dev/urandom') &&
		    ($fh = @fopen('/dev/urandom', 'rb'))) {
			$output = fread($fh, $count);
			fclose($fh);
		}

		if (strlen($output) < $count) {
			$output = '';
			for ($i = 0; $i < $count; $i += 16) {
				$this->random_state =
				    md5(microtime() . $this->random_state);
				$output .=
				    pack('H*', md5($this->random_state));
			}
			$output = substr($output, 0, $count);
		}

		return $output;
	}

	function encode64($input, $count)
	{
		$output = '';
		$i = 0;
		do {
			$value = ord($input[$i++]);
			$output .= $this->itoa64[$value & 0x3f];
			if ($i < $count)
				$value |= ord($input[$i]) << 8;
			$output .= $this->itoa64[($value >> 6) & 0x3f];
			if ($i++ >= $count)
				break;
			if ($i < $count)
				$value |= ord($input[$i]) << 16;
			$output .= $this->itoa64[($value >> 12) & 0x3f];
			if ($i++ >= $count)
				break;
			$output .= $this->itoa64[($value >> 18) & 0x3f];
		} while ($i < $count);

		return $output;
	}

	function gensalt_private($input)
	{
		$output = '$PXXXXX;
		$output .= $this->itoa64[min($this->iteration_count_log2 +
			((PHP_VERSION >= '5') ? 5 : 3), 30)];
		$output .= $this->encode64($input, 6);

		return $output;
	}

	function crypt_private($password, $setting)
	{
		$output = '*0';
		if (substr($setting, 0, 2) == $output)
			$output = '*1';

		$id = substr($setting, 0, 3);
		# We use "$P{1}quot;, phpBB3 uses "$H{1}quot; for the same thing
		if ($id != '$PXXXXX && $id != '$HXXXXX)
			return $output;

		$count_log2 = strpos($this->itoa64, $setting[3]);
		if ($count_log2 < 7 || $count_log2 > 30)
			return $output;

		$count = 1 << $count_log2;

		$salt = substr($setting, 4, 8);
		if (strlen($salt) != 8)
			return $output;

		# We're kind of forced to use MD5 here since it's the only
		# cryptographic primitive available in all versions of PHP
		# currently in use.  To implement our own low-level crypto
		# in PHP would result in much worse performance and
		# consequently in lower iteration counts and hashes that are
		# quicker to crack (by non-PHP code).
		if (PHP_VERSION >= '5') {
			$hash = md5($salt . $password, TRUE);
			do {
				$hash = md5($hash . $password, TRUE);
			} while (--$count);
		} else {
			$hash = pack('H*', md5($salt . $password));
			do {
				$hash = pack('H*', md5($hash . $password));
			} while (--$count);
		}

		$output = substr($setting, 0, 12);
		$output .= $this->encode64($hash, 16);

		return $output;
	}

	function gensalt_extended($input)
	{
		$count_log2 = min($this->iteration_count_log2 + 8, 24);
		# This should be odd to not reveal weak DES keys, and the
		# maximum valid value is (2**24 - 1) which is odd anyway.
		$count = (1 << $count_log2) - 1;

		$output = '_';
		$output .= $this->itoa64[$count & 0x3f];
		$output .= $this->itoa64[($count >> 6) & 0x3f];
		$output .= $this->itoa64[($count >> 12) & 0x3f];
		$output .= $this->itoa64[($count >> 18) & 0x3f];

		$output .= $this->encode64($input, 3);

		return $output;
	}

	function gensalt_blowfish($input)
	{
		# This one needs to use a different order of characters and a
		# different encoding scheme from the one in encode64() above.
		# We care because the last character in our encoded string will
		# only represent 2 bits.  While two known implementations of
		# bcrypt will happily accept and correct a salt string which
		# has the 4 unused bits set to non-zero, we do not want to take
		# chances and we also do not want to waste an additional byte
		# of entropy.
		$itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

		$output = '$2aXXXXX;
		$output .= chr(ord('0') + $this->iteration_count_log2 / 10);
		$output .= chr(ord('0') + $this->iteration_count_log2 % 10);
		$output .= 'XXXXX;

		$i = 0;
		do {
			$c1 = ord($input[$i++]);
			$output .= $itoa64[$c1 >> 2];
			$c1 = ($c1 & 0x03) << 4;
			if ($i >= 16) {
				$output .= $itoa64[$c1];
				break;
			}

			$c2 = ord($input[$i++]);
			$c1 |= $c2 >> 4;
			$output .= $itoa64[$c1];
			$c1 = ($c2 & 0x0f) << 2;

			$c2 = ord($input[$i++]);
			$c1 |= $c2 >> 6;
			$output .= $itoa64[$c1];
			$output .= $itoa64[$c2 & 0x3f];
		} while (1);

		return $output;
	}

	function HashPassword($password)
	{
		$random = '';

		if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) {
			$random = $this->get_random_bytes(16);
			$hash =
			    crypt($password, $this->gensalt_blowfish($random));
			if (strlen($hash) == 60)
				return $hash;
		}

		if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) {
			if (strlen($random) < 3)
				$random = $this->get_random_bytes(3);
			$hash =
			    crypt($password, $this->gensalt_extended($random));
			if (strlen($hash) == 20)
				return $hash;
		}

		if (strlen($random) < 6)
			$random = $this->get_random_bytes(6);
		$hash =
		    $this->crypt_private($password,
		    $this->gensalt_private($random));
		if (strlen($hash) == 34)
			return $hash;

		# Returning '*' on error is safe here, but would _not_ be safe
		# in a crypt(3)-like function used _both_ for generating new
		# hashes and for validating passwords against existing hashes.
		return '*';
	}

	function CheckPassword($password, $stored_hash)
	{
		$hash = $this->crypt_private($password, $stored_hash);
		if ($hash[0] == '*')
			$hash = crypt($password, $stored_hash);

		return $hash == $stored_hash;
	}
}

//原始密碼
$passwordValue = "123456";

//生成密碼
$wp_hasher = new PasswordHash(8, TRUE);
$sigPassword = $wp_hasher->HashPassword($passwordValue);
echo "生成的密碼為:".$sigPassword;
echo "\n";

//驗證密碼
$data = $wp_hasher->CheckPassword($passwordValue,$sigPassword);
if($data){
    echo '密碼正確';
}else{
	echo '密碼錯誤';
}

?>

此為一個wordpres密碼生成與登入驗證例項,其中HashPassword為生成密碼,CheckPassword為驗證密碼

itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; 為以上提到的生成salt的基礎字串。 

備註:由於csdn程式碼顯示外掛對特殊字元的限制。 請將以上程式碼中 XXXXX替換為 $'  注意有單引號,程式碼中一共有5處

相關推薦

wordpress密碼生成登入密碼驗證

一。研究wordpress時wordpess的密碼密碼生成與登入密碼驗證方式很重要 WordPress密碼已成為整合的首要目標,如何征服整合,就得了解WordPress密碼演算法。 WordPress系統的使用者密碼是儲存在wp_users資料表的user_pass欄位,密

wordpress系統忘記admin登入密碼的解決方法

最近有朋友的wordpress網站忘記admin密碼了,找到我協助解決,在這裡給大家分享給最簡單的解決方案: 一、用文字工具建立一個檔案,例如命名為resetPwd.php; 二、在該檔案resetPwd.php中新增以下程式碼: <?php //password resetter inclu

python利用hook技術破解https,抓取使用者名稱登入密碼

相對於http協議,https是的特點就是他的安全性,http協議的通訊內容用普通的嗅探器可以捕捉到,但是https協議的內容嗅探到的是加密後的內容,對我們的利用價值不是很高,所以一些大的網站----涉及到“大米”的網站,採用的都是http是協議。

Linux系統啟動到登入介面時忘記密碼或者更改登入密碼

1、啟動系統,在進入系統之前連續按鍵盤上的“Esc”鍵,讓系統進入如下畫面,再按“e”進行編輯。 2、系統進入如下介面後,使用鍵盤的上下方向鍵選擇kernel那行,然後再按e進入編輯。 3、系統進入如下介面後,在最末尾處加入引數“single”,使系統開機直

laravel修改密碼密碼Hash::check比較

/** * 重置密碼方法 * @param Request $request */ public function set_password(Request $request){ $id = Auth::user()->id; $oldpassword = $re

ssm中通過ajax或jquer的validate驗證密碼修改密碼的正確性

一.ajax 1. <script type="text/javascript"> //驗證原密碼1.ajax,正則 var ok1=false,ok2=false,ok3=false; $(function () { $

Android Studio運用MVP泛型登入記住密碼,自動登入

一:獲取佈局控制元件 許可權 二:記住密碼與自動登入 mMobile.setText(sp.getString("mMobile","")); mPassword.setText(sp.getString("mPassword","")); 三:登入 1.建立Log

思科交換機的登入密碼恢復應用

一、登入交換機 首先找一根CONSOLE線將計算機的串列埠與交換機的CONSOLE口相連。(注:CONSOLE[控制檯]線的一端為RJ45的水晶頭,一端用DB9的串列埠,如果想要自己製作這根線,可以使用一根UTP網線將兩端對調連線,即兩端的線序正好相反,再配一個RJ45轉

1093 登入密碼驗證

Description 編寫一個程式,模擬使用者登入系統的密碼驗證過程。系統提供給使用者的密碼長度最長為20個字元,若密碼輸入錯誤可以再次輸入。但為了保證使用者密碼安全,若連續輸入密碼錯誤超過5次就會鎖定賬號一段時間。 Input 輸入為若干個串,至EOF結束。

分享知識-快樂自己:註冊使用者密碼加密、登入驗證及許可權驗證

***********************以下內容僅作為參考使用:********************************* 1、使用者註冊時,將使用者設定的密碼加密後存入資料庫中(顯然密碼不能簡單地用md5加密一次或者乾脆不加密,這些都是會暴露使用者隱私的,甚至是觸動使用者的利益): 加密密

專案案例分享二:密碼策略上次互動式登入

       今天有個朋友跟我聊天時提到他們公司的域使用者經常會遇到被鎖定的狀態,而且4小時後會自動解鎖,想檢視AD裡面是否能夠統計和顯示域使用者登入失敗次數和時間等資訊。所以搭建了個小測試來解決這個問題。在配置上次互動式登入時,請注意以下事項:a. 要使上次互動式登入正確執

Asp.Net 中驗證 Discuz 的登入密碼

環境 VS 2015、Net 4.0 目的 在 Asp.Net 專案中可以驗證 Discuz中的使用者密碼 實現程式碼 string password="原始密碼"; string

使用Xshell生成key,免密碼登入linux

我們通常在Xshell使用命令ssh [email protected]遠端登入linux,這樣會提示我們輸入密碼比較麻煩,想免密碼登入的話,我們可以生成相應的key,然後放到遠端伺服器上,下面是具體的操作。 到這裡我們就生成的公鑰和私鑰了,我們把公鑰id_r

網站登入密碼忘記後,通過向手機發送驗證碼實現找回密碼的實現方法

今天我想了一天如何實現網站使用者在忘記了密碼後,如何通過向手機發送驗證碼來重新設定密碼。驗證碼的驗證以及生成都已經做好了,現在主要是解決如何向用戶手機發送簡訊。顯然這需要一個第三方提供的簡訊介面,來幫助我們實現向用戶手機發送驗證碼簡訊。這裡有一個非常好的第三方藉口。連線地址

登入密碼HTTP Request

  我們知道,在一些主流的瀏覽器中按F12,就會拉出一個檢視web訪問詳細資訊的視窗,在firefox中叫firebug,在chrome或者IE中,則叫developer tools,他們功能都大同小異,當然,比較重要的自然是檢視http request與response,

CISCO實驗-路由密碼設定SSH登入設定

1,CISCO 最基本的實驗,密碼設定   全域性模式口令 R1#configure terminal R1(config)#enable password XXXX   控制檯登入口令: router#config terminal router(config)#line console 0 router(

mac 免密碼登入伺服器密碼git提交

//本地執行 //生成key ssh-keygen -t rsa -C "你的Git註冊郵箱" -b 4096 //複製本地 id_rsa.pub cat ~/.ssh/id_rsa.pub //將cat的內容複製 //伺服器執行 //伺服器新增 vim /roo

mongodb叢集增加登入密碼驗證

mongodb叢集增加登入密碼驗證 2018年02月05日 1

VUE中登入密碼顯示隱藏的最簡設計——基於iview

#VUE中登入密碼顯示與隱藏的最簡設計——基於iview [toc] #1.背景 近期,在使用abp開發專案過程中,前端vue輸入登入密碼時預設隱藏,但是如果使用者輸錯密碼需要切換顯示跟隱藏。故有此文。 #2.實現最終效果 ##2.1 隱藏密碼 ![](https://img2020.cnblogs.

隨機密碼生成

個數字 分享 class pri 位數 style 結果 from string 1在26個字母大小寫和9個數字組成的列表中隨機生成10個8位數密碼 2程序如下 from random import choice import string def password():