【问题标题】:Encrypt a column in SQL 2000 via code or SQL script通过代码或 SQL 脚本加密 SQL 2000 中的列
【发布时间】:2025-12-01 17:40:01
【问题描述】:

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

我知道,从 SQL 2005 开始,有针对这些要求的内置功能主义者。但我担心 SQL 2000。

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

谢谢。

【问题讨论】:

  • VB6VB.NET?无论哪种方式,我都很确定谷歌会为此提供大量结果。为什么加密必须是可逆的?通常只使用单向哈希。
  • VB6.字符串值应首先加密。但是,当将来需要时,应该能够将相同的加密值解密为原始字符串值。

标签: sql encryption sql-server-2000


【解决方案1】:

您可以使用 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

参考链接 -

【讨论】:

    【解决方案2】:

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

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

    你看过这篇文章吗?它使用 TripleDES 和密码,听起来完全符合您的需求。 http://msdn.microsoft.com/en-us/library/ms172831(v=vs.80).aspx

    【讨论】:

      【解决方案3】:

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

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

      Salt 以纯文本形式保存在单独的表中。 您可以做的另一件事是连续多次加密相同的值。一个用户的小延迟不会很明显,但会增加暴力破解密码所需的工作量。

      命名表也是一个好习惯,这样表名就不会被猜到。当他们无法立即获得带有密码的表格时,这使得盲击更加困难。

      关于加密字符串的方法。

      SQL Server 2000 没有内置的对称函数。 有 2 个非对称内置函数:BINARY_CHECKSUMCHECKSUM

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

      【讨论】:

        【解决方案4】:

        首先让我指出您提到这是用于密码的。正确保护密码是一个复杂的主题,但至少我建议对它们进行加盐和散列处理。 SQL Server 确实包含一个散列函数(pwdencrypt 它在 SQL Server 2000 中,但直到更高版本才记录。最新版本包括具有更多选项的 Hashbytes),但此散列函数不是最安全的,您应该查看其他选项。

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

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

        【讨论】: