WCF初见之Salt+Hash加密

来源:互联网 发布:scrach源码 编辑:程序博客网 时间:2024/05/22 12:47

转自:http://www.cnblogs.com/yc-755909659/archive/2012/06/26/2563134.html

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

下面是具体步骤:

1.先创建相关数据库:

复制代码
--创建数据库表Salt_EncryptionCREATE 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值,对你输入的密码进行加密,然后和数据库中的密码进行对比就可以了。

0 0