zoukankan      html  css  js  c++  java
  • 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值,对你输入的密码进行加密,然后和数据库中的密码进行对比就可以了。

     
     
  • 相关阅读:
    OutOfMemoryError异常穷举
    Java的锁优化
    Java的线程安全
    Java的线程模型
    算法笔记_014:合并排序(Java)
    算法笔记_013:汉诺塔问题(Java递归法和非递归法)
    算法笔记_012:埃拉托色尼筛选法(Java)
    算法笔记_011:希尔排序
    算法笔记_010:插入排序(Java)
    算法笔记_009:字符串匹配(Java)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2563419.html
Copyright © 2011-2022 走看看