PWDENCRYPT 与 PWDCOMPARE 函数刚好是一对兄弟,一个负责加密、一个负责比对,但就是没有「解密」的函数。意思也就是说,使用PWDENCRYPT 加密过的资料是无法反解的,类似一种Hash 处理方法。
而且使用PWDENCRYPT 函数加密同样的字串资料,每次回应的结果都会不一样,但是使用PWDCOMPARE 函数一样可以对加密过的资料进行比对,以下是简单的使用方法介绍。

PWDENCRYPT 函数
select pwdencrypt('ok')
执行后的结果:
0x010066E6CDE3C8DE9363BE015AC22966456F230432D6485C6B58
注意:每次执行select pwdencrypt('ok') 的结果都会不一样,这是一种对密码保护的机制,只是我不清楚他的演算法。
PWDCOMPARE 函数
select pwdcompare('ok', 0x010066E6CDE3C8DE9363BE015AC22966456F230432D6485C6B58)
执行后的结果为1 或0 而已,1 代表密码比对成功,0 代表密码比对失败。
第一个参数是当初加密时的设定的密码字串。第二个参数是当时加密后的二进位值。
事实上,SQL Server 本身在进行密码验证时,应该也就是用PWDCOMPARE 函数在比对的,怎么说呢?你可以先执行以下T-SQL 查询出系统登入帐号的password_hash 栏位:
SELECT password_hash FROM master.sys.sql_logins WHERE name='sa'
然后再将结果用PWDCOMPARE 函数验证一下你设定的sa 密码,如果回传值是1 就代表密码正确。
备注:虽然有人说这类undocumented functions 未来可能随时被取消或删除,但我却认为这一组Function 应该会长久存在,只是「没有说明文档」而已。

我也简单的测试了一下,这两个Function 在SQL 2000, 2005, 2008 都可以使用,只是我也发现了一些不同的SQL Server 版本之间在使用这两个Function 时的小差异:
使用PWDENCRYPT 时SQL 2000 与SQL 2005/2008 加密过后的hash 长度不一样!
SQL 2005/2008 加密过的密码在SQL 2000 中无法使用PWDCOMPARE 函数验证密码!
SQL 2005 与 SQL 2008 基本上是相容的。
SQL 2000 加密过的密码虽然比较长,但在SQL 2005/2008 中还是可以使用PWDCOMPARE 函数验证密码!
要使用这两个Function 的人可能要小心的不是PWDENCRYPT 与PWDCOMPARE 函数未来会消失,而是要考虑未来的SQL Server 版本对两个Function 的实做是否能相容,目前看来向下相容应该是没问题,但未来是否会持续向下相容还是很难说,毕竟资料库中的资料还是会一直沿用下去。