SQL Server中的PWDENCRYPT与PWDCOMPARE函数
前幾天有個客戶的網站出問題(不是我們開發的),請我們幫他看,主要的問題是他們的網站會員在進行查詢密碼時,會員收到信的時候在密碼的欄位竟然會出現 System.Binary[] 字樣。而我進去資料庫中查看時,發現該會員資料表中的密碼欄位是 varbinary 格式,而我當然不知道他儲存的是什麼值,進而查看他們資料庫中的 Stored Procedure 對於密碼欄位的操作方法,這才發現他們用來驗證會員是否正確登入的方法是使用 PWDCOMPARE 函數。
由於我沒看過這個函數,便上網去查看看,發現這個函數真的是個迷樣的 SQL 內建 Function,而且在 MSDN, TechNet 上都查不到相關文件,而我在 Google 搜尋 pwdcompare site:microsoft.com 得到的結果也僅僅才 127 筆資料而已,且大多這個關鍵字僅僅出現在論壇中,感覺這個 Function 似乎是微軟刻意不讓他曝光的。
而 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 時的小差異:
1. 使用 PWDENCRYPT 時 SQL 2000 與 SQL 2005/2008 加密過後的 hash 長度不一樣!
2. SQL 2005/2008 加密過的密碼在 SQL 2000 中無法使用 PWDCOMPARE 函數 驗證密碼!
3. SQL 2005 與 SQL 2008 基本上是相容的。
4. SQL 2000 加密過的密碼雖然比較長,但在 SQL 2005/2008 中還是可以使 用 PWDCOMPARE 函數驗證密碼!
要使用這兩個 Function 的人可能要小心的不是 PWDENCRYPT 與 PWDCOMPARE 函數未來會消失,而是要考慮未來的 SQL Server 版本對兩個 Function 的實做是否能相容,目前看來向下相容應該是沒問題,但未來是否會持續向下相容還是很難說,畢竟資料庫中的資料還是會一直沿用下去。
转自:
http://blog.miniasp.com/post/2008/12/SQL-Server-secret-PWDENCRYPT-and-PWDCOMPARE-function.aspx
SQL Server中的PWDENCRYPT与PWDCOMPARE函数的更多相关文章
- SQL_Server_2008定期自动备份详细图解
SQL_Server_2008定期自动备份详细图解 设置自动数据库的定期备份计划. http://wenku.baidu.com/link?url=Tu ...
- C++构造函数,复制构造函数和析构函数专题
链接:http://wenku.baidu.com/view/d9316c0e52ea551810a6872a.html 本文作者:黄邦勇帅本文是学习 C++中的最基本的内容,因此学习 C++就应全部 ...
- 第二天:python的函 数、循环和条件、类
https://uqer.io/community/share/54c8af17f9f06c276f651a54 第一天学习了Python的基本操作,以及几种主要的容器类型,今天学习python的函数 ...
- windows server 2008 r2 启用索引(转)
08r2的“windows search”服务默认是不安装的,要想启用索引执行下列步骤: 1.打开“服务器管理”——选中“角色”——右边选中“添加角色”——勾选“文件服务”. 2. ...
- R语言作为BI中ETL的工具
R语言作为BI中ETL的工具,增删改 R语言提供了强大的R_package与各种数据库进行数据交互. 外加其强大数据变换清洗函数,为ETL提供一条方便快捷的道路. RODBC ROracal RMys ...
- 有一台机器,上面有m个储存空间。然后有n个请求,第i个请求计算时需要占 R[i]个空间,储存计算结果则需要占据O[i]个空间(据O[i]个空间(其中O[i]<R[i])。问怎么安排这n个请求的顺序,使
有一台机器,上面有m个储存空间.然后有n个请求,第i个请求计算时需要占 R[i]个空间,储存计算结果则需要占据O[i]个空间(据O[i]个空间(其中O[i]<R[i]).问怎么安排这n个请求的顺 ...
- Problem Q: C语言习题 计算该日在本年中是第几天
Problem Q: C语言习题 计算该日在本年中是第几天 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 4572 Solved: 2474[Subm ...
- No.2 R语言在生物信息中的应用—模式匹配
目的: 1. 计算自定义模序在所有蛋白质的匹配位点和次数 2. 输出超过阈值的蛋白质序列到Hit_sequences.fasta 3. Hit_sequences.fasta中序列用小写字母,匹配用大 ...
- 给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后。 要求:空间复杂度是O(1),且只能遍历一次字符串。
题目:给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后. 要求:空间复杂度是O(1),且 ...
- 概率图模型 基于R语言 这本书中的第一个R语言程序
概率图模型 基于R语言 这本书中的第一个R语言程序 prior <- c(working =0.99,broken =0.01) likelihood <- rbind(working = ...
随机推荐
- C++ 语言特性的性能分析
转载:http://www.cnblogs.com/rollenholt/archive/2012/05/07/2487244.html 大多数开发人员通常都有这个观点,即汇编语言和 C 语 ...
- 初学linux命令
linux系统的精髓在于它的命令行 早就听说要学习linux系统,就要学习它的命令行(Command Line Interface).说来惭愧,已经使用了linuxmint快两个月了,虽然能够使用一些 ...
- Lucene学习总结之七:Lucene搜索过程解析
一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: ...
- Lucene学习总结之一:全文检索的基本原理
一.总论 根据http://lucene.apache.org/java/docs/index.html 定义: Lucene 是一个高效的,基于Java 的全文检索库. 所以在了解Lucene之前要 ...
- [转]如何正确设置nginx中remote_addr和x_forwarded_for参数
做网站时经常会用到remote_addr和x_forwarded_for这两个头信息来获取客户端的IP,然而当有反向代理或者CDN的情况下,这两个值就不够准确了,需要调整一些配置. 什么是remote ...
- 清空DNS缓存
昨天写了个Python的脚本,功能就是爬取一个网页上的Google ip地址再写入到本机的hosts里面去. 但是写完并且运行完成之后发现上不了Google.于是想到了是不是要清空一下DNS的缓存.不 ...
- jquery向列表添加新元素
$(function () { $('#btn').click(function () { $('ol').append('<li>'+$('#text').val()+'</li& ...
- linux下安装pdf
官方下载地址:http://www.foxitsoftware.cn/downloads/ 问题:下载官方包以后解压,双击不能打开,也没有任何提示. 用teminal 来打开foxitreader,t ...
- 雅思创始人Keith Taylor谈英语学习
雅思创始人Keith Taylor谈英语学习 “要学的是信息,而不是语言” 我们要学习一个国家的语言就得知道这个国家的方方面面.要学习英语就得了解英美国家的社会.经济.人文.历史等各方面的信息. 大家 ...
- thinkphp项目目录
# ThinkPHP核心文件介绍 ├─ThinkPHP.php 框架入口文件 ├─Common 框架公共文件 ├─Conf 框架配置文件 ├─Extend ...