C : public_seed C->S: username, reply S->C: Ok or error 對于4.1及以后版本,public_seed是隨機生的20個可打印的ASCII字符 然后客戶端這么計算rep" />
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,相等則驗證通過。
bitsCN.com聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com