WordPress系統(tǒng)的用戶密碼是保存在wp_users數(shù)據(jù)表的user_pass字段,密碼是通過Portable PHP password hashing framework類產(chǎn)生的,密碼的形式是隨機(jī)且不可逆,同一個(gè)明文的密碼在不同時(shí)間,產(chǎn)生的密文也不一樣,相對(duì)來說較為安全。
創(chuàng)新互聯(lián)服務(wù)緊隨時(shí)代發(fā)展步伐,進(jìn)行技術(shù)革新和技術(shù)進(jìn)步,經(jīng)過十多年的發(fā)展和積累,已經(jīng)匯集了一批資深網(wǎng)站策劃師、設(shè)計(jì)師、專業(yè)的網(wǎng)站實(shí)施團(tuán)隊(duì)以及高素質(zhì)售后服務(wù)人員,并且完全形成了一套成熟的業(yè)務(wù)流程,能夠完全依照客戶要求對(duì)網(wǎng)站進(jìn)行成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、建設(shè)、維護(hù)、更新和改版,實(shí)現(xiàn)客戶網(wǎng)站對(duì)外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網(wǎng)化提供全面的解決方案。
WordPress用戶密碼產(chǎn)生的過程是,當(dāng)需要生成用戶密碼的時(shí)候,隨機(jī)產(chǎn)生了一個(gè)salt,然后將salt和password相加,又進(jìn)行了count次md5,最后和encode64的hash數(shù)值累加,就得到了一個(gè)以$P$開頭的密碼,這個(gè)密碼每次產(chǎn)生的結(jié)果都不一樣,下面就是產(chǎn)生WordPress密碼的代碼,將其放在WordPress根目錄下,就可以生成一個(gè)加密的password,用這個(gè)密碼替換掉wp_users數(shù)據(jù)表的user_pass字段即可修改密碼。
?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用戶密碼還有更簡單的方法,就是直接將wp_users數(shù)據(jù)表的user_pass字段修改為32位的md5(passowrd)即可修改密碼為password,這樣的密碼形式當(dāng)然不是很安全,所以,當(dāng)這個(gè)用戶在WordPress登錄后,系統(tǒng)會(huì)自動(dòng)將MD5密碼修改為以$P$開頭的密碼。
WordPress的這種支持簡單md5格式的密碼使得其他系統(tǒng)(例如Ucenter系統(tǒng))的用戶整合WordPress更為簡單。
希望可以幫到你!
WordPress用戶密碼“產(chǎn)生”的過程是,當(dāng)需要“生成”用戶密碼的時(shí)候,隨機(jī)產(chǎn)生了一個(gè)salt
驗(yàn)證的時(shí)候還用這個(gè)salt行了,個(gè)人意見,僅供參考。
wordpress是開源的,樓主可以讀源碼細(xì)研究。
以創(chuàng)建wordpress網(wǎng)站的數(shù)據(jù)庫為例
1、創(chuàng)建數(shù)據(jù)庫
創(chuàng)建可指定字符,或者不指定字符,如果不指定字符,默認(rèn)為 utf8mb4 和 utf8mb4_0900_ai_ci
2、創(chuàng)建用戶
可自行指定用戶可訪問的IP地址范圍。
3、授權(quán)用戶
4、直接一步到位
或者 這種方法 :創(chuàng)建并授權(quán)用戶,是二和三的合并。
1、查看數(shù)據(jù)庫
show databases可查詢所有存在的數(shù)據(jù)庫
2、查看用戶信息
用戶信息在系統(tǒng)數(shù)據(jù)庫mysql中的user表中。密碼查詢不會(huì)顯示明文密碼,而是顯示為加密后的密文。
3、查看用戶權(quán)限
有兩種方式查看。
第一種方式 : show grants for 'userwordpress';
第二種方式: select * from mysql.user where user='userwordpress'G;
g 相當(dāng)于’;’
G使每個(gè)字段打印到單獨(dú)的行,也有 ’;' 的作用
只能查出哪個(gè)數(shù)據(jù)庫的哪張表的權(quán)限,如查userwordpress在mysql數(shù)據(jù)庫的user表的權(quán)限,顯示都是N(no),沒有權(quán)限,如果查root用戶就都是Y(yes)選擇了。
用drop而非delete,簡單的區(qū)分就是,drop是刪除【表】,truncate與delete則是刪除表中【記錄】。
刪除用戶
同理,刪除數(shù)據(jù)庫
用drop刪除時(shí),會(huì)有確認(rèn)信息,為了防止誤刪。(刪庫跑路,請(qǐng)謹(jǐn)慎操作)
一。研究wordpress時(shí)wordpess的密碼密碼生成與登錄密碼驗(yàn)證方式很重要
WordPress密碼已成為整合的首要目標(biāo),如何征服整合,就得了解WordPress密碼算法。
WordPress系統(tǒng)的用戶密碼是保存在wp_users數(shù)據(jù)表的user_pass字段,密碼是通過Portable PHP password hashing framework類產(chǎn)生的,密碼的形式是隨機(jī)且不可逆,同一個(gè)明文的密碼在不同時(shí)間,產(chǎn)生的密文也不一樣,相對(duì)來說較為安全。
二。密碼生成方式
隨機(jī)產(chǎn)生一個(gè)salt 并將salt和password相加
進(jìn)行了count次md5 然后和encode64的hash數(shù)值累加
最后得到一個(gè)以$P$開頭的密碼,這個(gè)密碼每次產(chǎn)生的結(jié)果都不一樣
以下為在wordpress中調(diào)用密碼生成的代碼
[php] view plain copy print?
?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密碼生成與登錄驗(yàn)證
wordpress中位置為\wp-includes\class-phpass.php
以下是wordpress中生成密碼的代碼直接運(yùn)行可查看密碼的生成以及驗(yàn)證過程
[php] view plain copy print?
?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";
//驗(yàn)證密碼
$data = $wp_hasher-CheckPassword($passwordValue,$sigPassword);
if($data){
echo '密碼正確';
}else{
echo '密碼錯(cuò)誤';
}
?
此為一個(gè)wordpres密碼生成與登錄驗(yàn)證實(shí)例,其中HashPassword為生成密碼,CheckPassword為驗(yàn)證密碼
itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; 為以上提到的生成salt的基礎(chǔ)字符串。
備注:由于csdn代碼顯示插件對(duì)特殊字符的限制。 請(qǐng)將以上代碼中 XXXXX替換為 $' 注意有單引號(hào),代碼中一共有5處