2009-04-24 113 views
4

我想我要問的是不可能的,但是,認爲這值得一試。SQL Server PWDEncrypt值比較

我們有一個使用SQL Server PWDEncrypt和PWDCompare函數的應用程序。

系統的一部分會創建用戶的重複項(相同的登錄名和密碼)。由於系統中存在一個錯誤,而不是複製密碼的二進制存儲的PWDEncrypt,而是執行另一個密碼的PWDEncrypt。因此二進制值不匹配。

是否有可能找出這兩個二進制值是否具有相同密碼的哈希值?

例如PWDEncrypt('abc')= PWDEncrypt('abc')

如果我能做到這一點,那麼這意味着我可以找出有多少用戶這個bug實際上受到影響,而不是與數千人打交道!

編輯:爲了澄清,PWDEncrypt('abc')= PWDEncrypt('abc')將不會返回true,因爲密碼被散列爲不同的值。

雖然我知道從密碼中獲得密碼是不可能的,但是PWDCOMPARE('abc',PWDENCRYPT('abc'))的作用,因此,內部SQL Server必須做的不僅僅是散列你正在比較的密碼並檢查值是否相同。

+0

我認爲PWDCOMPARE('abc',PWDENCRYPT('abc'))在內部工作的方式是PWDCOMPARE將散列'abc'與salt在PWDENCRYPT('abc')生成的散列中使用這種方式,PWDCOMPARE永遠不需要解密密碼,也不知道它是什麼。 – 2009-04-27 12:51:28

回答

2

看來,喬爾的說法是在SQL Server 2000中正確的,但在SQL Server 2005中

當您在2000相同的語句生成散列一起,他們最終以相同的鹽不是(隨機種子數字在開始),這使得它們是相同的。 在2005年不同的鹽總是產生,所以如果你試試這個SQL Server 2000上,他們不會匹配


PRINT PWDEncrypt('abc')
PRINT PWDEncrypt('abc')
PRINT PWDEncrypt('aaa')
PRINT PWDEncrypt('bbb')

你總是有相同的鹽在哈希的開始,與2005年一樣,它總是不同的。另請注意,在SQL Server 2005中,哈希值較短,因爲它不再以大寫形式維護散列副本,以防大小寫敏感的密碼兼容性。

如果你可以用相同的鹽生成哈希,那麼你可以比較它們(這意味着嘗試一個暴力或字典攻擊)看看this article如何做到這一點。它展示瞭如何使用CryptCreateHash函數在C中破解SQL Server密碼。

0

只需在查詢窗口中鍵入SELECT CASE WHEN PWDEncrypt('abc') = PWDEncrypt('abc') THEN 1 ELSE 0 END並查看結果。

+1

問題在於,每次調用密碼時,PWDEncrypt都會爲相同的密碼返回不同的值。因此,PWDEncrypt('abc')= PWDEncrypt('abc')始終爲false。我想知道是否有另一種方式來做這個檢查。 – 2009-04-24 14:49:52

1

只要嘗試使用實現pwdencrypt('YourPa $$ w0rd')的函數來存儲它,然後使用內置函數返回BIT 0/1的另一個函數pwdcompare('EnteredPassWord',(從光盤中選擇密碼) .Users ='UserName'))) 就是這樣;-)