DebugLZQ在這篇文章里寫了webQQ登陸過程,這個過程我沒有去驗證,但是我卻突然想到另一個問題,那QQ的密碼是明文的?
現在我簡單總結一下這個登陸過程:
1. 輸入:QQ號,用戶的明文密碼,驗證碼
2. 將輸入進行哈希(MD5)
3. 將QQ號、驗證碼、哈希值傳輸,因為驗證碼每次不一樣,所以計算出來的哈希,每次都是不一樣的
4. 服務器端驗證,成功或者失敗
前面3步都很正常,也很安全,就算在第3步,把QQ號、驗證碼、哈希值得到,還是無法解出用戶的密碼。
既然我們普通人員無法解出密碼,那么服務器也是從用戶請求的值解出密碼的。
那么,問題來了,服務器是怎么驗證用戶的有效性的呢?
1. 驗證哈希值——假設服務器存儲的是密碼哈希的值,那么很簡單,驗證哈希值與服務器上存儲的哈希值是否一致即可——可是,這個哈希值是每次登陸,都會變化的,也就是服務器不能存一個靜態的哈希值,所以,不會是驗證哈希值。
這個方法行不通
2. 通過在服務器端運行同樣的哈希過程,然后比較哈希值——這個過程是可行的,因為大家使用同樣的輸入和計算過程,那么最終得到結果肯定是一樣的。
但是,這有一個前提: 那就是服務器端具有與用戶同樣的輸入值:
用戶的輸入值有:QQ號、密碼、驗證碼
所以,服務器端需要拿到用戶的明文密碼才可能重現哈希過程。
3. 其他辦法驗證?我暫時想不出來,還有其他辦法驗證用戶身份——歡迎提供其他驗證思路
所以,我的結論是:
驗證服務器是可以取到用戶的明文密碼的——也就是說存儲的要么是明文密碼(雖然這種可能性不大),要么存儲的是可逆加密的密碼。
至於騰訊公司,在內部采用了什么辦法來保證密碼不會被泄露,就不得而知了。