程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql身份驗證

mysql身份驗證

編輯:MySQL綜合教程

mysql身份驗證   MySQL的身份認證協議是一種CHAP協議,即,挑戰應答。   S->C : public_seed   C->S: username, reply   S->C: Ok or error   對於4.1及以後版本,public_seed是隨機生的20個可打印的ASCII字符   然後客戶端這麼計算reply: passphrase=sha1("password") storedhash=sha1(passphrase) reply=xor(passphrase, sha1(public_seed,storedhash)   其中storedhash即是服務器存在數據庫中的hash過的密碼。   然後服務器在收到reply後這麼對比:   先從數據庫中根據username查到storedhash。   然後計算passphrase。原理是xor是可逆的。 passphrase=xor(reply, sha1(public_seed,storedhash))   然後對passphrase做sha1,和storedhash做二進制比較 sha1(passphrase)==storedhash     首先,我們知道,用戶密碼是保存在mysql.user這個表的password列,並且是以hash值的形式加密保存的。     整個驗證過程如下:當客戶端請求連接時,     1.服務器端會隨機生成一個random string發送給客戶端;     2.客戶端收到random string後,進行hash加密        第一步,將密碼hash,得到hash值hash_stage1;  eg.hash_stage1=sha1("password");         第二步,二次hash,得到hash_stage2;  eg. hash_stage2=sha1(hash_stage1);        第三步,將密碼二次hash得到的值與random string進行hash,得到hash_stage3; eg. hash_stage3=sha1("random string",hash_stage2);        第四步,異或處理准備發送給服務器端,得到reply=xor(hash_stage1,hash_stage3);        最後,將reply的值發送給服務器端。     3.服務器端收到reply後同樣進行hash運算       第一步,將保存的hash形式的密碼hashpassword與random string進行hash,得到server_hash_stage1=sha1("random string","hashpassword");       第二步,將客戶端發送的reply與剛才得到的hash值進行異或運算,得到xor_value; eg. xor_value=xor(reply,server_hash_stage1);       第三步,將得到的異或值進行hash,得到server_hash_stage2; eg. server_hash_stage2=sha1(server_hash_stage1);       第四步,驗證,將最後得到的hash值server_hash_stage2與保存的密碼hashpassword進行比較。eg.   server_hash_stage2==hashpassword,相等則驗證通過。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved