这个是我的作品,原理就是将字符串@str 与 @pwdstr 做异或处理得到密文,要解密的时候,将密文与 @pwdstr 再次异或就可以解密这个 @pwdstr 就是密匙,如果解密时提供的密匙与加密时的不一样,解密的将是一堆乱码,所以只要保管好密匙就可以了,加密算法公开也不会有问题. 其他还有很多的加密算法,如果楼主嫌不好的话,找专业加密网站看看.

解决方案 »

  1.   

    試試用sql的函數:
    *
    加密函數:PWDENCRYPT
    比較函數:PWDCOMPARE
    */DECLARE @tabPassword TABLE(pass_col varbinary(256)) 
    DECLARE @pwd_old varchar(50)
    DECLARE @pwd_new varbinary(256)
    DECLARE @en_pwd varbinary(256) --加密后的數據据 SELECT @pwd_old='aaa' 
    INSERT @tabPassword VALUES(PWDENCRYPT(@pwd_old))--加密 
    --SELECT @pwd_old
    --SELECT * FROM @tabPasswordSELECT @pwd_new=pass_col FROM @tabPassword --通過函數比較,相同返回1
    IF PWDCOMPARE(@pwd_old, @pwd_new)=1 
    SELECT '通過校驗!'
    ELSE 
    SELECT '密碼錯誤!'
    SELECT @pwd_old='bbb' 
    IF PWDCOMPARE(@pwd_old, @pwd_new)=1 
    SELECT '通過校驗!'
    ELSE 
    SELECT '密碼錯誤!'--不區分大小寫
    SELECT @pwd_old='AAA' 
    IF PWDCOMPARE(@pwd_old, @pwd_new)=1 
    SELECT '通過校驗!'
    ELSE 
    SELECT '密碼錯誤!'
      

  2.   

    不好意思,问一下这里的逗号什么意思
    ...)))+@re ,@i=@i-1
               ^
      

  3.   

    progress99(如履薄冰) : 刚才你那个东东怎么解密
      

  4.   

    谢谢progress99(如履薄冰) 我如何查看表中数据
      

  5.   

    呵呵,不能解,隻能通過PWDCOMPARE函數判斷兩值是否相同,仔細看看例子
      

  6.   

    *
    加密函數:PWDENCRYPT
    比較函數:PWDCOMPARE
    */
    這兩函數主要用於密碼校驗,如果樓主要看,那就要自己寫加解密函數
      

  7.   

    加密函數:PWDENCRYPT
    比較函數:PWDCOMPAREPWDENCRYPT加密后的不能解密,所以用来做密码合适,用于加密字段就根本不合适,它无法还原数据.
      

  8.   

    SQL根本不支持直接对字段加密.解决的方法1是通过权限控制来防止别个查询方法2,是通过类似我那样的函数,在保存数据前先加密,然后再保存.
    读取时再还原.
      

  9.   

    --使用我的函数,存储和读取数据的示例--测试的表
    declare @表 table(name varchar(10),pwd varchar(10))--插入数据
    insert @表 select '张三',dbo.f_jmstr('123','keystr')
    union all  select '李四',dbo.f_jmstr('345','keystr')--查看表中的内容
    select *
    ,解密后的内容=dbo.f_jmstr(pwd,'keystr')
    ,key错误的情况=dbo.f_jmstr(pwd,'abc')
    from @表/*--测试结果
    name       pwd        解密后的内容     key错误的情况   
    ---------- ---------- ---------- ---------- 
    张三         ZWJ        123        ;5)
    李四         XQL        345        93/(所影响的行数为 2 行)
    --*/
      

  10.   

    create view v_randasselect c=unicode(cast(round(rand()*255,0) as tinyint))go create function f_jmstr(@str varchar(8000),@type bit)returns varchar(8000)/**参数说明*str:要加密的字符串或已经加密后的字符*type:操作类型--0加密--解密*返回值说明*当操作类型为加密时(type--0):返回为加密后的str,即存放于数据库中的字符串*当操作类型为解密时(type--1):返回为实际字符串,即加密字符串解密后的原来字符串*/Asbegin         declare @re varchar(8000)--返回值         declare @c int--加密字符         declare @i int/**加密方法为原字符异或一个随机ASCII字符*/    if @type=0--加密    begin                   select @c=c,@re='',@i=len(@str) from v_rand                   while @i>0                       select @re=nchar(unicode(substring(@str,@i,1))^@c^@i)+@re                                     ,@i=@i-1                   set @re=@re+nchar(@c)    end    else--解密    begin                   select @i=len(@str)-1,@c=unicode(substring(@str,@i+1,1)),@re=''                   while @i>0                            select @re=nchar(unicode(substring(@str,@i,1))^@c^@i)+@re ,@i=@i-1         end         return(@re)endgo --测试declare @tempstr varchar(20)set @tempstr='  1 2   3aA'select dbo.f_jmstr(dbo.f_jmstr(@tempstr,0),1)输出结果  1 2   3aA