背景
master.dbo.sysxlogins 的 password 欄位儲存加密後的二進位值。加密邏輯位於 sp_addlogin 內呼叫 PWDENCRYPT(),驗證則使用 PWDCOMPARE()。
函數說明
| 函數 | 用途 | 語法 |
PWDENCRYPT | 單向雜湊加密明文密碼 | PWDENCRYPT(@clear_password) 回傳 varbinary |
PWDCOMPARE | 比對明文與加密密碼是否相符 | PWDCOMPARE(@clear_password, @encrypted_password, @version) 回傳 1/0 |
實作範例
DECLARE @ClearPwd VARCHAR(255) = 'mySecret123';
DECLARE @EncPwd VARBINARY(255);
-- 加密
SELECT @EncPwd = CONVERT(VARBINARY(255), PWDENCRYPT(@ClearPwd));
SELECT @EncPwd AS EncryptedPassword;
-- 結果範例:0x0100A3F2...
-- 驗證正確密碼
SELECT PWDCOMPARE(@ClearPwd, @EncPwd, 0) AS MatchResult; -- 1
-- 驗證錯誤密碼
SELECT PWDCOMPARE('WrongPwd', @EncPwd, 0) AS MatchResult; -- 0
應用場景
- 自行管理帳號密碼表,僅儲存
PWDENCRYPT 結果,驗證時用 PWDCOMPARE 比對,避免明文外洩。
- 審計現有登入密碼強度(需搭配字典檔)。
- 跨伺服器同步登入密碼:匯出
password 欄位至新伺服器 sp_addlogin @password = 0x..., @encryptopt = 'skip_encryption'。
注意事項
- 此為未公開內部函數,版本間可能變更,生產環境建議改用
CREATE LOGIN ... WITH PASSWORD = '...' HASHED(SQL 2005+)。
PWDCOMPARE 第三參數 @version 對應 xstatus & 2048,一般傳 0 即可。
- 單向雜湊不可逆向解密,僅能比對驗證。
- 上一篇文章: SQL Server 資料庫與資料表匯出匯入完整操作指南
- 下一篇文章: SQL Server 2000 物件權限查詢預存程序 usp_getObjectAuthor
Copyright ©
程式碼之家 All Rights Reserved