好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

WCF初见之Salt+Hash加密

WCF初见之Salt+Hash加密

WCF初见之Salt+Hash加密

最近要对密码进行Salt加密,故查看了相关资料,其实就是把需要加密的值先和随机的Salt值连接在一起,再进行加密(可以哈希,也可以MD5加密等等)。

下面是具体步骤:

1.先创建相关数据库:

 --  创建数据库表Salt_Encryption 
 CREATE   TABLE   Salt_Encryption
(
Name               VARCHAR ( 15 )  PRIMARY   KEY   NOT   NULL ,         --  用户名 
 [  Password  ]           VARCHAR ( 50 )  NOT   NULL ,                     --  密码 
Salt              VARCHAR ( 10 )  NOT   NULL                      --  Salt值 
)

2.新建一个Salt_Encryption_WCF的WCF应用程序,因为要用到数据库,所以先创建一个名为SaltModel.edmx的实体类:

然后跟着步骤来就可以了

3.创建服务契约和创建服务:
(1)IService1.cs (创建服务契约):

 using   System;
  using   System.Collections.Generic;
  using   System.ServiceModel;

  namespace   Salt_Encryption_WCF
{
    
    [ServiceContract]
      public   interface   IService1
    {
           /*  **********************************密码加密********************************************************  */ 
         //   创建一个随机的Salt值 
         [OperationContract]
          string   CreateSalt();
          //  对Salt后的密码进行哈希 
         [OperationContract]
          string  CreatePasswordHash( string  pwd,  string   strSalt);
          /*  ************************************数据库操作*******************************************  */ 
         //   新增数据 
         [OperationContract]
          void  insertSql( string  strName,  string  strPwd,  string   Salt);
          //   查询数据 
         [OperationContract]
        IEnumerable <Salt_Encryption>  selectSql();
    }
} 

(2)Service1.svc (创建服务)

 using   System;
  using   System.Collections.Generic;
  using   System.Linq;
  using   System.ServiceModel;
  using   System.Web.Security;
  using   System.Security.Cryptography;
  namespace   Salt_Encryption_WCF
{
    
      public   class   Service1 : IService1
    {
          /*  **********************************密码加密********************************************************  */ 
         private   const   int  saltLenght =  4 ;   //  定义Salt值的长度 

         ///   <summary> 
         ///   创建一个随机的Salt值
          ///   </summary> 
         ///   <returns>  随机数的字符串  </returns> 
         public   string   CreateSalt()
        {
              //  生成一个加密的随机数 
            RNGCryptoServiceProvider rng =  new   RNGCryptoServiceProvider();
              byte [] buff  =  new   byte  [saltLenght];
            rng.GetBytes(buff);
              //  返回一个Base64随机数的字符串 
             return   Convert.ToBase64String(buff);
        }

          ///   <summary> 
         ///   对Salt后的密码进行哈希
          ///   </summary> 
         ///   <param name="pwd">  密码  </param> 
         ///   <param name="strSalt">  Salt值  </param> 
         ///   <returns>  返回加密好的密码  </returns> 
         public   string  CreatePasswordHash( string  pwd, string   strSalt)
        {
              //  把密码和Salt连起来 
             string  saltAndPwd =  String.Concat(pwd,strSalt);
              //  对密码进行哈希 
             string  hashenPwd = FormsAuthentication.HashPasswordForStoringInConfigFile(saltAndPwd, "  sha1  "  );
              //  返回哈希后的值 
             return   hashenPwd;
        }
          /*  ************************************数据库操作*******************************************  */  
        SaltEnEntities db  =  new   SaltEnEntities();
          ///   <summary> 
         ///   新增数据
          ///   </summary> 
         ///   <param name="strName">  用户名  </param> 
         ///   <param name="strPwd">  密码  </param> 
         ///   <param name="Salt">  Salt值  </param> 
         public   void  insertSql( string  strName, string  strPwd, string   strSalt)
        {
            Salt_Encryption s  =  new   Salt_Encryption();
            s.Name  =  strName;
            s.Password  =  strPwd;
            s.Salt  =  strSalt;
              //  添加数据 
             db.Salt_Encryption.AddObject(s);
              //  保存数据的改变 
             db.SaveChanges();
        }


          ///   <summary> 
         ///   查询数据
          ///   </summary> 
         ///   <returns></returns> 
         public  IEnumerable<Salt_Encryption>  selectSql()
        {
            IEnumerable <Salt_Encryption> sql =  from  info  in   db.Salt_Encryption
                                                 select   info;
              return   sql;
        }
    }
} 

4.然后新建一个名为Test2Salt的Web客户端(用于测试),先引用创建的WCF服务,具体过程见 WCF初见之HelloWorld ,然后进行Web端的代码编写:
(1)Test2SaltForm.aspx(Web界面代码)

<%@ Page Language= "  C#  "  AutoEventWireup= "  true  "  CodeBehind= "  Test2SaltForm.aspx.cs  "  Inherits= "  Test2Salt.Test2SaltForm  "  %>

<!DOCTYPE html PUBLIC  "  -//W3C//DTD XHTML 1.0 Transitional//EN  "   "  http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd  " >

<html xmlns= "  http://www.w3.org/1999/xhtml  " >
<head runat= "  server  " >
    <title></title>
</head>
<body>
    <form id= "  form1  "  runat= "  server  " >
    <div>
    <asp:Label ID= "  Name  "  runat= "  server  "  Text= "  用户名:  "  Height= "  20px  "  Width= "  80px  " ></asp:Label>
    <asp:TextBox ID= "  toName  "  runat= "  server  "  Height= "  20px  "  Width= "  120px  "  ></asp:TextBox>
    </div>
    <div>
    <asp:Label ID= "  Password  "  runat= "  server  "  Text= "  密码:  "  Height= "  20px  "  Width= "  80px  " ></asp:Label>
    <asp:TextBox ID= "  toPassword  "  runat= "  server  "  Height= "  20px  "  Width= "  120px  "   
            TextMode = "  Password  " ></asp:TextBox>
    </div>
    <asp:Button ID= "  InsertData  "  runat= "  server  "  Text= "  插入数据  "   
        onclick = "  InsertData_Click  " />
    <asp:GridView ID= "  gv  "  runat= "  server  " >
    </asp:GridView>
    </form>
</body>
</html>

(2)Test2SaltForm.aspx.cs(功能实现代码)

 using   System;
  using   System.Collections.Generic;
  using   System.Linq;
  using   System.Web;
  using   System.Web.UI;
  using   System.Web.UI.WebControls;

  namespace   Test2Salt
{
      public   partial   class   Test2SaltForm : System.Web.UI.Page
    {
        host.Service1Client host  =  new   host.Service1Client();
          protected   void  Page_Load( object   sender, EventArgs e)
        {
              if  (! IsPostBack) { DataPageBind(); }
        }

          private   void   DataPageBind()
        {
              //  绑定数据,并显示数据 
            gv.DataSource =  host.selectSql();
            gv.DataBind();
        }

          protected   void  InsertData_Click( object   sender, EventArgs e)
        {
              string  strName =  toName.Text.Trim();
              string  strPwd =  toPassword.Text.Trim();
              //  得到Salt值 
             string  Salt =  host.CreateSalt();
              //  得到加密后的密码 
             string  Pwd =  host.CreatePasswordHash(strPwd,Salt);
            host.insertSql(strName,Pwd,Salt);
            DataPageBind();
        }


    }
} 

5.效果图如下:

PS:如果想验证用户名和密码的话,只要获取数据库中的Salt值,对你输入的密码进行加密,然后和数据库中的密码进行对比就可以了。

 

 

标签:  我的WCF之路

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于WCF初见之Salt+Hash加密的详细内容...

  阅读:35次