2011-07-31 36 views
3

我在SQL Server 2008中的現有數據庫通過存儲過程對現有的PHP的Web應用程序進行用戶鑑權。 Web應用程序向存儲過程發送一個字符串,但存儲過程存儲並使用SQL校驗和(http://msdn.microsoft.com/en-us/library/ms189788.aspx)檢查該值。存儲過程將字符串轉換爲NVARCHAR(50),並將CHECKSUM作爲int存儲在用戶表中。實現SQL校驗和Java的

我現在寫上現有的數據庫之上的新的Java應用程序,我正在寫一個自定義的春天認證管理器。我想重新實現Java中的CHECKSUM算法,所以我不需要調用存儲過程來執行轉換,但是我找不到有關SQL CHECKSUM如何工作的任何文檔。

我嘗試下面的代碼,有猜測,這是CRC32,但它不能返回相同的值SQL CHECKSUM:

String pass = "foobar"; 
CRC32 crc32 = new CRC32(); 
crc32.update(pass.getBytes("UTF-16")); //This is due to the stored procedure casting as nvarchar 
crc32.getValue(); 

任何人都可以點我到SQL校驗使用,所以我的算法可以在Java中重新實現它?

的問題也不是其算法提供了安全的最佳哈希值。由於我們不準備強制系統範圍的密碼重置,因此安全性不在此特定情況下的要求範圍內。問題是T-SQL CHECKSUM使用什麼算法,以便它可以重新實現。這個特定的用例是用於驗證的,但是在許多不同的應用程序中這是有必要的。

+0

難道你們就不能只是使用一些現有的Java功能,並更新所有與新的哈希的數據?也許作爲保留當前版本的新專欄(以防萬一)。這可能也有幫助http://stackoverflow.com/q/331157/27535 – gbn

+2

這可能最終不得不成爲最後的選擇。但是,這將需要重置現有帳戶上的密碼,因爲原始密碼未存儲在數據庫中。 – aweigold

+2

@aweigold:+1以正確的方式處理密碼:-) –

回答

-1

我建議你通過HASBYTESMD5算法取代TSQL CHECKSUM,所以你很容易地找到在Java中實現MD5。你會從HASHBYTES得到

還有一個好處是更穩定的行爲。 CHECKSUM可以爲不同的輸入生成相同的散列。

瞭解如何使用HASHBYTES與MD5:

HASHBYTES('MD5', @input) 

編輯:答案要評論關於MD5

HASHBYTES還支持SHASHA1算法,所以沒有問題,如果你不會使用MD5

+0

我完全同意這一點。不過,我想維護現有的用戶帳戶,因此,此選項將要求用戶重置其密碼。 – aweigold

+0

交易主,沒有。不要使用md5進行身份驗證。 –

+1

這仍然需要一個存儲過程或SQL調用:OP想要刪除它。並需要更新所有現有的值 – gbn

1

在SQL Server論壇上,在這個page,它聲明:

內置在SQL Server CHECKUM功能是建立在一系列的4位左旋轉XOR運算。有關更多說明,請參閱此post

我能夠將BINARY_CHECKSUM移植到c#(抱歉,我手頭沒有Java編譯器),它似乎在工作......我將在稍後查看普通的CHECKSUM ...

private int SQLBinaryChecksum(string text) 
{ 
    long sum = 0; 
    byte overflow; 
    for (int i = 0; i < text.Length; i++) 
    { 
     sum = (long)((16 * sum)^Convert.ToUInt32(text[i])); 
     overflow = (byte)(sum/4294967296); 
     sum = sum - overflow * 4294967296; 
     sum = sum^overflow; 
    } 

    if (sum > 2147483647) 
     sum = sum - 4294967296; 
    else if (sum >= 32768 && sum <= 65535) 
     sum = sum - 65536; 
    else if (sum >= 128 && sum <= 255) 
     sum = sum - 256; 

    return (int)sum; 
} 
+0

這看起來很有希望。我會在有空的時候檢查一下,如果有效,請接受答案。 – aweigold

+1

對不起,一直很忙,但我試了一下。它適用於BINARY_CHECKSUM。稍後我會看看是否可以在CHECKSUM上找到任何東西。如果你有興趣,我在這裏有一個時髦的要點https://gist.github.com/aweigold/7144091#file-binarychecksum-groovy – aweigold