通过代码或SQL脚本加密SQL 2000中的列

时间:2013-05-30 07:25:30

标签: sql encryption sql-server-2000

我正在使用SQL 2000.“用户”表中有一个字符串列'Password'。它有大约3k行。我的要求是加密“密码”列的所有值。 此外,我应该能够在需要时解密这些加密的密码字段。

我知道,从SQL 2005开始,有内置的功能主义者可以满足这些要求。但是我担心SQL 2000。

如果有任何方法可以通过VB代码或SQL脚本实现我的要求,请建议 。不使用任何第三方工具。我搜索了很多地方但没有成功。

感谢。

4 个答案:

答案 0 :(得分:5)

您可以使用SQL Server 2000中可用的未记录的PWDENCRYPTPWDCOMPARE函数 -

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 :(得分:1)

密码通常以1路哈希(例如SHA1)存储,这意味着它们是加密的,永远不需要解密。当用户输入密码时,您的代码将对其进行散列并检查散列值是否与数据库中的散列值匹配。

但是,听起来您还需要能够解密密码。为此,有几种非对称算法(RSA,PGP等),您将拥有私钥和公钥对。私钥是保密的,而公钥可以共享给其他人,以便能够在发送给您之前加密他们自己的信息。这听起来有点矫枉过正,因为只有你的VB6代码需要加密数据,而不是任何第三方。因此,您可以简单地使用对称算法(如Blowfish或TripleDES),您可以使用相同的密码(而不是密钥对)来加密和解密数据。该密码可以存储在服务器上的配置文件中。请确保其免受未经授权的用户的侵害。

你看过这篇文章吗?它使用带有密码的TripleDES,听起来就像你需要的那样。 http://msdn.microsoft.com/en-us/library/ms172831(v=vs.80).aspx

答案 2 :(得分:1)

现在,仅仅为自己加密密码被认为是一种不好的做法。通常会在每个密码中添加一个任意字符串(称为“salt”),然后应用加密。原则上,添加“salt”和加密的顺序无关紧要。所有这些组合的编码强度相同:

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

Salt以纯文本形式保存在单独的表中。 您可以做的另一件事是连续多次加密相同的值。一个用户的小延迟不会引人注意,但会增加强制密码所需的工作量。

对表命名也是一种好习惯,因此无法猜出表名。当他们无法立即获得密码表时,它会使盲目攻击变得更加困难。

关于加密字符串的方法。

SQL Server 2000 没有内置的对称功能。 有两个不对称的内置函数:BINARY_CHECKSUMCHECKSUM

<强> VB VB为您提供了已实现的算法以及执行自己实现的工具。 @SuperFunkyMonkey引用的文章包含Security.Cryptography Namespace的链接。 另一种对称算法(你可以解码的算法)是Rijndael。

答案 3 :(得分:1)

首先我要指出你提到的这是一个密码。正确保护密码是一个复杂的主题,但至少我会建议对其进行腌制和散列。 SQL Server确实包含一个哈希函数(pwdencrypt它在SQL Server 2000中,但直到更高版本才会记录。最新版本包括Hashbytes,它有更多选项),但这个哈希函数不是最安全的,你应该看看其他选项。

使用哈希而不是加密确实违反了您声明的要求之一,以便能够解密这些加密字段,但使用密码通常被认为最好不能解密它们。 (您可以通过散列密码将散列值与用户输入的密码进行比较,您只是无法轻松解密以恢复纯文本版本。)

如果你真的想加密它们,请查看System.Security.Cryptography命名空间和Simple3Des类,特别是VB。这里有文档和关于加密程序here中的字符串的演练。