首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 密碼加密機制揭秘:PWDENCRYPT 與 PWDCOMPARE 實戰應用

     編輯:關於SqlServer

背景探源

SQL Server 登入密碼儲存在 master.dbo.sysxlogins 的 password 欄位(varbinary),並非明文。透過系統預存程序 sp_addlogin 可見其加密邏輯核心為 pwdencrypt() 函數。本文示範如何利用這對內建函數實現自訂密碼雜湊驗證。

核心函數解析

函數用途特性
PWDENCRYPT(@plaintext)單向雜湊加密輸出 varbinary,同一明文每次產生不同密文(含鹽值),不可逆向
PWDCOMPARE(@plaintext, @hash, @version)驗證明文與雜湊是否匹配回傳 1/0,@version 0 為舊版、1 為新版(SQL 2000+)

完整範例腳本

-- 1. 明文加密存儲
DECLARE @ClearPWD VARCHAR(255) = 'MyStr0ngP@ss';
DECLARE @EncryptedPWD VARBINARY(255);
SELECT @EncryptedPWD = CONVERT(VARBINARY(255), PWDENCRYPT(@ClearPWD));
SELECT @EncryptedPWD AS HashedPassword;  -- 0x0100... (含版本、鹽、雜湊)

-- 2. 正確密碼驗證
SELECT PWDCOMPARE(@ClearPWD, @EncryptedPWD, 0) AS MatchResult;  -- 1

-- 3. 錯誤密碼驗證
SELECT PWDCOMPARE('WrongPassword', @EncryptedPWD, 0) AS MatchResult;  -- 0

實務應用場景

  1. 自建使用者表密碼欄位:pwd VARBINARY(255) NOT NULL DEFAULT PWDENCRYPT('init'),登入時呼叫 PWDCOMPARE 驗證,避免自行實作雜湊演算法風險。
  2. 跨伺服器密碼同步:將雜湊值直接複製到目標伺服器 sysxlogins,無需知悉明文。
  3. 審計現有弱密碼:搭配常見弱密碼字典,批次呼叫 PWDCOMPARE 掃描 sysxlogins。

注意事項

  • 單向不可逆:遺失明文無法從雜湊還原,務必備份明文或提供重設機制。
  • 版本參數:SQL 2000 之後預設使用版本 1(SHA-1 基礎),舊版相容需指定 0。
  • 非標準加密:Microsoft 未公開演算法細節,不建議用於需符合 FIPS/PCI-DSS 規範的系統;此類場景請改用 HASHBYTES('SHA2_256', ...) + 自管鹽值。
  • 權限:PWDENCRYPT 需 CONTROL SERVER 或 SECURITYADMIN 角色;PWDCOMPARE 公開可用。

進階:模擬 sp_password 邏輯

CREATE PROC dbo.usp_ChangePassword
    @LoginName SYSNAME,
    @OldPlain  VARCHAR(128),
    @NewPlain  VARCHAR(128)
AS
BEGIN
    DECLARE @Hash VARBINARY(255);
    SELECT @Hash = password FROM master.dbo.sysxlogins WHERE name = @LoginName;
    IF @Hash IS NULL OR PWDCOMPARE(@OldPlain, @Hash, 1) = 0
        THROW 50001, '原密碼錯誤或登入不存在', 1;

    EXEC sp_password @NewPlain, @LoginName;  -- 內部自動呼叫 PWDENCRYPT
END;

結語

善用內建 PWDENCRYPT/PWDCOMPARE 可快速建立相對安全的密碼驗證機制,減少自行實作加密的風險。但對高合規要求系統,請採用標準化雜湊演算法並妥善管理鹽值與金鑰輪換。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved