2013-05-30 57 views
7

我正在使用SQL 2000.在'用戶'表中存在字符串列「密碼」。它有大約3k行。我的要求是加密「密碼」列的所有值。 另外,我應該能夠在需要時解密那些加密的密碼字段。通過代碼或SQL腳本對SQL 2000中的列進行加密

我知道,從SQL 2005開始,這些需求就有內置功能。但我擔心SQL 2000.

請建議如果有任何方法可以通過VB代碼或SQL腳本達到我的要求。不與任何第三方工具。我搜查了很多地方,但沒有成功。

謝謝。

+1

'VB6'或'VB.NET'?無論哪種方式,我很確定谷歌會有很多結果。爲什麼加密無論如何都是可逆的?通常只使用單向散列。 –

+0

VB6。 字符串值應該先加密。但是,如果將來需要時,應該能夠將相同的加密值解密爲原始字符串值。 – Kings

回答

5

你可以使用無證PWDENCRYPT和SQL Server提供PWDCOMPARE功能2000 -

CREATE TABLE #USER 
(
    LOGIN_ID varchar(20), 
    UserPassword nvarchar(256) 
) 

-- Encrypt & Insert Password 
-- Note: You will have to write UPDATE on existing records 
INSERT #USER VALUES ('my_loginid', PWDENCRYPT('MyPassword1')) 


DECLARE @InputPassword VARCHAR(100) 
DECLARE @IsValid INT = 0 

-- Test for Correct Password 

SET @InputPassword = 'MyPassword1' 

SET @IsValid = (SELECT PWDCOMPARE(@InputPassword, UserPassword, 0) 
       FROM #USER 
       WHERE LOGIN_ID = 'my_loginid') 


SELECT @IsValid AS 'Test1'; 

-- Test for Wrong Password 

SET @InputPassword = 'WrongPassword' 

SET @IsValid = (SELECT PWDCOMPARE(@InputPassword, UserPassword, 0) 
       FROM #USER 
       WHERE LOGIN_ID = 'my_loginid') 

SELECT @IsValid AS 'Test2' 

DROP TABLE #USER 

參考鏈接 -

1

密碼通常以單向散列(例如SHA1)存儲,這意味着它們是加密的並且永遠不需要解密。當用戶輸入密碼時,您的代碼會將其散列並檢查散列值是否與數據庫中的散列值相匹配。

但是,這聽起來像你有一個要求也能夠解密密碼。爲此,有幾種不對稱算法(RSA,PGP等),您將擁有私鑰和公鑰對。私鑰保密,而公鑰可以共享給其他人在發送給你之​​前能夠加密自己的信息。這聽起來像是過度殺毒,因爲只有你的VB6代碼需要加密數據而不是任何第三方。因此,您可以簡單地使用對稱算法(如Blowfish或TripleDES),使用相同的密碼(而不是密鑰對)來加密和解密數據。該密碼可以存儲在服務器上的配置文件中。確保保護它免受未經授權的用戶的侵害。

你見過這篇文章嗎?它使用帶有密碼的TripleDES,這聽起來完全像你所需要的。 http://msdn.microsoft.com/en-us/library/ms172831(v=vs.80).aspx

1

現在認爲只是自己加密密碼被認爲是一種不好的做法。通常將任意字符串(稱爲「salt」)添加到每個密碼,然後應用加密。原則上,按照什麼順序添加「salt」並進行加密並不重要。所有這些組合都在編碼強度等於:

HASH (Pass & Salt) OR HASH (HASH (Pass)+Salt)) OR HASH (HASH (Pass) + HASH (Salt))

鹽被保持在單獨的表中作爲純文本。 您可以做的另一件事是連續多次加密相同的值。一個用戶的小延遲不會被注意到,但它會增加暴力破解密碼所需的努力。

命名錶也是一個很好的做法,所以表名不能被猜到。當他們無法立即獲取密碼錶時,它會使盲目攻擊變得更加困難。

至於一種加密字符串的方法。

SQL Server 2000 沒有內置的對稱函數。 有2個非對稱內置函數:BINARY_CHECKSUMCHECKSUM

VB VB給你已經實現的算法以及工具來做你自己的實現。通過@SuperFunkyMonkey簡稱 文章具有指向Security.Cryptography Namespace。 另一個對稱算法(一個可以解碼)的Rijndael算法。

1

讓我指出你所提到的,這是一個密碼啓動。正確保護密碼是一個複雜的主題,但至少我會建議對它們進行醃製和散列。 SQL Server會包括散列函數(pwdencrypt這是在SQL Server 2000,但沒有記錄到更高版本,最新的版本包括HASHBYTES擁有更多的選擇),但這個散列函數是不是最安全的,你應該看看其他選項。

使用散列函數而不是加密不違反你們所要求的一個能夠解密加密的那些領域,但它通常被認爲是更好的密碼不能夠對其進行解密。 (您可以通過散列密碼將散列值與用戶輸入的密碼進行比較,但您無法輕易解密以恢復純文本版本。)

如果您確實想要加密它們,請查看在System.Security.Cryptography命名空間和Simple3Des類,特別是VB。這裏有文檔和一個加密程序here中的字符串的演練。