利用MSSQL sp自制未公开的加密函数

Microsoft SQL Server是如何加密口令的?如何自制未公开的加密函数?

       

  如果对MSSQL的用户信息有兴趣的,可能会发现master.dbo.sysxlogins里面存放着用户的口令,可是呢,password字段如果不是null就是一堆看不懂的binary,这个口令是怎么加密的呢?

 
   
   
   
 
 
   
   
     
       
         
       
     
     
   
 
 
   
   
   
 



  其实只要仔细看看master.dbo.sp_addlogin就知道了,MSSQL的sp都可以看到代码,真是不错。





  让我们来看看它是怎么做的,注意这一行select @passwd = pwdencrypt(@passwd),这个时后@passwd就被加密了,让我们也来试一下

DECLARE @ClearPWD varchar(255)

DECLARE @EncryptedPWD varbinary(255)

SELECT @ClearPWD = 'test'

SELECT @EncryptedPWD = CONVERT(varbinary(255), pwdencrypt(@ClearPWD))

SELECT @EncryptedPWD 

  看上去不错,确实被加密了,可是我怎么还原呢?



  呵呵,这就没戏了,口令加密都是单向的,用加密后的密文来比较就可以了。



  继续看看其它用户相关的sp,可以发现master.dbo.sp_password里面有口令比较的内容。

pwdcompare(@old, password, (CASE WHEN xstatus&;2048 = 2048 THEN 1 ELSE 0 END)) 

  不用去理会xstatus,这是一个状态掩码,一般我们用的时候就直接用0就可以了

DECLARE @ClearPWD varchar(255)

DECLARE @EncryptedPWD varbinary(255)

SELECT @ClearPWD = 'test'

SELECT @EncryptedPWD = CONVERT(varbinary(255), pwdencrypt(@ClearPWD))

SELECT pwdcompare(@ClearPWD, @EncryptedPWD, 0)

SELECT pwdcompare('ErrorPassword', @EncryptedPWD, 0) 

  这样我们就可以使用这两个函数来加密自己的密码了:) 。

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [SQL] 的这些文章也感兴趣:

IBatis.Net使用方法之八:动态选择Dao的设计分析
数据库访问抽象类实现项目数据库灵活切换
金额阿拉伯数字转换为中文的存储过程
全面探讨PL/SQL的复合数据类型
SQL循序渐进(20)Aliases 、In以及子查询
asp读sql数据时出现乱码问题的解决方法
Database Virtualization - Is it worth it?
推荐;适合SQL初学者学习的SQL FAQ集锦
SQL数据库攻击详解
微软声称创造了ETL的新纪录——在30分钟内完成1TB的数据存储量