我正在使用 SQL 2000。表“用户”中有一个字符串列“密码”。它有大约 3k 行。我的要求是加密“密码”列的所有值。此外,我应该能够在需要时解密那些加密的密码字段。
我知道,从 SQL 2005 开始,有针对这些要求的内置功能主义者。但我担心 SQL 2000。
请建议是否有任何方法可以通过 VB 代码或 SQL 脚本来实现我的要求。不使用任何第三方工具。我搜索了很多地方,但没有成功。
谢谢。
我正在使用 SQL 2000。表“用户”中有一个字符串列“密码”。它有大约 3k 行。我的要求是加密“密码”列的所有值。此外,我应该能够在需要时解密那些加密的密码字段。
我知道,从 SQL 2005 开始,有针对这些要求的内置功能主义者。但我担心 SQL 2000。
请建议是否有任何方法可以通过 VB 代码或 SQL 脚本来实现我的要求。不使用任何第三方工具。我搜索了很多地方,但没有成功。
谢谢。
您可以使用SQL Server 2000 中提供的未记录PWDENCRYPT
和功能 -PWDCOMPARE
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
参考链接——
密码通常以单向哈希(例如 SHA1)存储,这意味着它们是加密的,永远不需要解密。当用户输入密码时,您的代码将对其进行哈希处理并检查哈希值是否与数据库中的哈希值匹配。
但是,听起来您还需要能够解密密码。为此,有几种非对称算法(RSA、PGP 等),您可以在其中拥有私钥和公钥对。私钥是保密的,而公钥可以共享给其他人,以便在将自己的信息发送给您之前对其进行加密。这听起来有点矫枉过正,因为只有您的 VB6 代码需要加密数据,而不需要任何第 3 方。因此,您可以简单地使用对称算法(如 Blowfish 或 TripleDES),在其中使用相同的密码(而不是密钥对)来加密和解密数据。该密码可以存储在服务器上的配置文件中。确保保护它免受未经授权的用户的侵害。
你看过这篇文章吗?它使用 TripleDES 和密码,听起来完全符合您的需要。 http://msdn.microsoft.com/en-us/library/ms172831(v=vs.80).aspx
如今,仅自行加密密码被认为是一种不好的做法。通常会在每个密码中添加一个任意字符串(称为“salt”),然后应用加密。原则上,添加“盐”和加密的顺序无关紧要。所有这些组合在编码强度上都是相等的:
HASH (Pass & Salt) OR HASH (HASH (Pass)+Salt)) OR HASH (HASH (Pass) + HASH (Salt))
盐以纯文本形式保存在单独的表中。您可以做的另一件事是连续多次加密相同的值。一个用户的小延迟不会很明显,但会增加暴力破解密码所需的工作量。
命名表也是一个好习惯,这样表名就不会被猜到。当他们无法立即获得带有密码的表格时,这会使盲击变得更加困难。
至于加密字符串的方法。
SQL Server 2000
没有内置的对称函数。有 2 个非对称内置函数:BINARY_CHECKSUM
和CHECKSUM
.
VB VB 为您提供了已经实现的算法以及进行您自己的实现的工具。@SuperFunkyMonkey 引用的文章具有指向Security.Cryptography Namespace的链接。另一种对称算法(您可以解码)是 Rijndael。
让我首先指出您提到这是用于密码的。正确保护密码是一个复杂的主题,但至少我建议对它们进行加盐和散列处理。SQL Server 确实包含一个散列函数(pwdencrypt 它在 SQL Server 2000 中,但直到更高版本才记录。最新版本包括具有更多选项的 Hashbytes),但此散列函数不是最安全的,您应该查看其他选项。
使用散列而不是加密确实违反了您声明的能够解密这些加密字段的要求之一,但是使用密码通常认为最好不要解密它们。(您也可以通过对密码进行哈希处理来将哈希值与用户输入的密码进行比较,只是无法轻松解密以恢复纯文本版本。)
如果您真的想加密它们,请查看 System.Security.Cryptography 命名空间和特别适用于 VB 的 Simple3Des 类。这里有文档,这里有关于在程序中加密字符串的演练。