使用DPAPI加密数据库连接字符串

        项目中要用到这个,刚好看到IssueVision中有相关的内容,就不客气地用上了 tongue_smile.gif.
我用得是C#,就参考了DataProtection.cs,在安装目录下的1.0\CS\IssueVision\Libraries里面,VB的是在1.0\VB\IssueVision\Libraries的DataProtection.vb.
        代码中的重点是两个方法,一个用来加密,一个用来解密.我就讲讲加密的用法(解密是逆向,代码差不多)和使用中的要点吧.
        以下是IssueVision的代码:
       
ExpandedBlockStart.gif ContractedBlock.gif /**/ /// <summary>
InBlock.gif
/// 使用DPAPI加密字符串
InBlock.gif
/// </summary>
InBlock.gif
/// <param name="data">需要加密的字符串</param>
InBlock.gif
/// <param name="store">枚举值,0对应Machine,根据本机加密;1对应User根据用户名加密</param>
ExpandedBlockEnd.gif
/// <returns>经加密后的结果字符串</returns>

None.gif public   static   string  Encrypt( string  data, Store store)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
// 结果字符串
InBlock.gif
    string  result = "";
InBlock.gif    
InBlock.gif    
//Win32是一个内部辅助类,用来调用DPAPI函数
InBlock.gif
    Win32.DATA_BLOB inBlob = new Win32.DATA_BLOB();
InBlock.gif    Win32.DATA_BLOB entropyBlob 
= new Win32.DATA_BLOB();
InBlock.gif    Win32.DATA_BLOB outBlob 
= new Win32.DATA_BLOB();
InBlock.gif
InBlock.gif    
try 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
//设置API所需的加密标志
InBlock.gif
        int flags = Win32.CRYPTPROTECT_UI_FORBIDDEN | (int)((store == Store.Machine) ? Win32.CRYPTPROTECT_LOCAL_MACHINE : 0);
InBlock.gif
InBlock.gif        
//设置输入数据并设置一个随机的字符串(Consts.EntropyData),以便和其他程序区分
InBlock.gif
        SetBlobData(ref inBlob, ASCIIEncoding.ASCII.GetBytes(data));
InBlock.gif        SetBlobData(
ref entropyBlob, Consts.EntropyData);
InBlock.gif
InBlock.gif        
//调用DPAPI函数进行加密
InBlock.gif
        if (Win32.CryptProtectData(ref inBlob, ""ref entropyBlob, IntPtr.Zero, IntPtr.Zero, flags, ref outBlob)) 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
byte[] resultBits = GetBlobData(ref outBlob);
InBlock.gif            
if (resultBits != null
InBlock.gif                result 
= Convert.ToBase64String(resultBits);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
//有异常,返回空字符串
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
finally 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
// 释放资源
InBlock.gif
        if (inBlob.pbData.ToInt32() != 0
InBlock.gif            Marshal.FreeHGlobal(inBlob.pbData);
InBlock.gif        
if (entropyBlob.pbData.ToInt32() != 0
InBlock.gif            Marshal.FreeHGlobal(entropyBlob.pbData);
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return result;
ExpandedBlockEnd.gif}


下面是几点要注意的:
1.DPAPI只在2k以上的系统上才有,win9x系列就不要想了omg_smile.gif.不过我们是WEB应用,要在IIS上跑,早就没考虑过win9x,呵呵shades_smile.gif.
2.为了自己方便使用,最后再做一个小Form程序,专门用来加密或解密,以便直接用在web.config文件中.
3.最好在安装程序类中就把用户输入的数据库名称、服务器地址等拼成连接字符串给加密起来,以后就不用改了
4.在开发环境,最后在web.config中加一个是否采用加密字符串的状态变量,以方便调试,要不看到一大堆字符,谁都会头晕的哦.

本来想做一个示例程序给大家参考的,但是没找到怎么上传附件,惭愧red_smile.gif...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值