ASP.NET Membership 重置密碼

ASP.NET 的使用者密碼有 加密 以及 安全性問題 兩道防護,所以如果使用者忘記密碼,同時也忘記安全性問題的解答,那 MIS 也神仙難救了 (註 1)。

通常使用者在註冊的時候會被要求輸入 明碼的 Password,然後系統會隨機產生一個 密錀 Salt,經過 MD5Sum 的運算產生 暗碼的 Password。最後會將 Salt 與暗碼的 Password 存入資料庫,因為 MD5Sum 的運算是單向不可逆的 (註 2),所以即使駭客取得暗碼的 Password,也無法反推出原本的 Password。

同時為了讓使用者忘記密碼時,可以自行取回密碼,所以有了 安全性問題與解答,其中安全性問題是用來提示的,而安全性解答則與 Password 相同的方式,使用 同一個密錀 Salt 加密後,存入資料庫。因此當使用者忘記密碼時,會收到安全性問題的提示,然後被要求提供解答,如果解答不正確,當然就無法取回密碼了 (因為 MIS 也看不到問題的解答啊 ...)


有了這些背景後,我們就來看看別人是如何破解的。首先在資料庫中有一個預存程序

aspnet_Membership_SetPassword

看名字就知道是用來設定密碼的,它的參數如下:

@ApplicationName 應用程式名稱
@UserName 使用者名稱
@NewPassword 加密過的密碼
@PasswordSalt 密錀 Salt
@CurrentTimeUtc 更新時間
@PasswordFormat 密碼格式 (是否加密?)

其中 PasswordSalt 需自行產生,而 NewPassword 則是利用重新設定的密碼跟 PasswordSalt 運算產生的結果。

最後利用 SQL Command 將這些資料寫回資料庫即可。但因為 PasswordSalt 變更,造成原本的安全性解答無法使用,所以變更密碼後還要利用

MembershipUser.ChangePasswordQuestionAndAnswer

來重設安全性問題與解答,我目前的做法是修改 ChangePassword  控制項的樣版,在使用者變更密碼的同時,一併重設安全性問題與解答。

所以 MIS 收到使用者忘記密碼的通知時,只要隨機產生一個密碼並且變更,然後通知使用者以此隨機密碼登入,再修改為自己的密碼,並重設安全性問題與解答即可。

不過這個預存程序並非公開的方法,所以並不保證將來一體適用,所以只能走一步算一步了。
  • 註 1:因為 MembershipUser.ResetPassword 需要安全性問題的解答
  • 註 2:網路上似乎有暴力破解法,也就是將常用的單字利用公開的 MD5Sum 演算法產生字典,然後再將取得的暗碼 Password 與字典內容比對,就可以反推回原來的密碼了。所以一般密碼規則才會要求要有特殊字元,就是要避免這個問題
參考:

留言

這個網誌中的熱門文章

Linux 批次檔的寫法

【分享】如何顯示 Debug Message

[分享] Visual Studio 遠端偵錯