
此文章主要讲述的是未公开的MS SQL server 加密函数,如果对MSSQL的用户信息有兴趣了解的话,你就可能会发现master.dbo.sysxlogins里面存放着用户的口令,可是呢,password字段如果不是null就是一堆看不懂的binary,这个口令是怎么加密的呢?
其实只要仔细看看master.dbo.sp_addlogin就知道了,MSSQL的sp都可以看到代码,真是不错。
让我们来看看它是怎么做的,注意这一行select @passwd = pwdencrypt(@passwd),这个时后@passwd就被加密了,让我们也来试一下
看上去不错,确实被加密了,可是我怎么还原呢?
呵呵,这就没戏了,口令加密都是单向的,用加密后的密文来比较就可以了。
继续看看其它用户相关的sp,可以发现master.dbo.sp_password里面有口令比较的内容。
pwdcompare(@old, password, (CASE WHEN xstatus&2048 = 2048 THEN 1 ELSE 0 END))
不用去理会xstatus,这是一个状态掩码,一般我们用的时候就直接用0就可以了
【编辑推荐】
怎样修改SQL Server 2005/2008的系统存储过程
我们知道,SQLServer2005/2008的系统存储过程在正常情况下是无法直接修改的。 尽管本文是介绍怎样修改它的,但在这里,我还是建议大家尽量不要去修改它。 (好像有点绕哈...)OK,闲话少说,下面我举个实际案例讲解一下,如对于系统存储过程sp_Monitor,若要运行此存储过程,用户必须是sysadmin固定服务器角色的成员。 通过执行命令:sp_helptextsp_Monitor,我们可以看到,该过程中存在这样的语句:if(not(is_srvrolemember(sysadmin)=1))(,-1,-1)return(1)end在这里,我想将该过程中的这些语句去掉,让它能被普通用户执行。 下面是具体的修改步骤:1、停止SQLServer服务2、进入命令提示行模式。 依次执行以下命令:1)cdC:/ProgramFiles/MicrosoftSQLServer/MSSQL.1/MSSQL/Binn--注:这是SQL2005的默认安装目录,如你改变了实际安装路径,请按实际修改2)sqlservr-sMSSQLSERVER-m--注:启动SQLServer服务,-s指定实例名称(这里的实例名称是MSSQLSERVER,可按实际修改),-m指定以单用户管理模式启动3、以数据库专用管理员(DAC)方式连接SSMS(此处可参见SQLServer数据库专用管理员DAC连接方式)4、执行语句:USEmssqlsystemresource这里,我友情说明一下,mssqlsystemresource是一个系统数据库,它存储了所有系统存储过程、视图和函数。 但它对于所有用户来说,都是不可见的,也就是说,在SSMS、等里面,你都看不到它,如果在非DAC连接下,执行上述语句,系统会报错。 5、执行语句:alterdatabasemssqlsystemresourcesetread_write--将mssqlsystemresource置为可修改状态,mssqlsystemresource数据库默认是只读的。 6、sp_helptextsp_Monitor--显示该存储过程的源代码,你可将sp_Monitor改成你实际要改的存储过程名。 7、拷贝步骤6的结果,将createproc改成alterproc,并按你的实际需求修改代码,这里,我将前述的if(not(is_srvrolemember(sysadmin)=1))--MakesurethatitistheSAexecutingthis......等语句去掉。 8、执行修改后的语句。 --到这一步为止,系统存储过程sp_Monitor已经被我们改了。 9、alterdatabasemssqlsystemresourcesetread_only--将mssqlsystemresource还原为只读状态10、最后,停止SQLServer服务,并以正常方法重新启动SQLServer.老实说,上面的方法显得较为繁琐,不得万不得已,我不推荐使用。 (再强调一次)其实,可以拷贝系统存储过程的源代码到一个新建的存储过程中,然后再对这个新建的存储过程进行修改,在使用的时候,直接调用这个新过程即可。 同样可以达到目的,而且还没有任何副作用
jsp中的string类型转换为SQL Server中的datetime类型
你的这个sql语句不应该这么写应该这样写:select * from TestTable wheretime between beginTime andendTimedate类型不能用>=或<= 的,string类型的也不能用这样来判断的你要把string类型时间转化为datetime类型 试试用 convert()这个函数,具体如下:convert(数据类型,你要转化的原始数据或是某一列名)
SQL 产生10个20—99之间的随机整数

SELECT FLOOR(RAND()* 79 + 20)用上面的sql执行,可以得出20到99之间的一个随机整数,然后你可以用循环或者重新使用10次得出10个随机数
发表评论