本文共 4923 字,大约阅读时间需要 16 分钟。
最近要对密码进行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] IEnumerableselectSql(); }}
(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值的长度 ////// 创建一个随机的Salt值 /// ///随机数的字符串 public string CreateSalt() { //生成一个加密的随机数 RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); byte[] buff = new byte[saltLenght]; rng.GetBytes(buff); //返回一个Base64随机数的字符串 return Convert.ToBase64String(buff); } ////// 对Salt后的密码进行哈希 /// /// 密码 /// Salt值 ///返回加密好的密码 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(); ////// 新增数据 /// /// 用户名 /// 密码 /// Salt值 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(); } ////// 查询数据 /// ///public IEnumerable selectSql() { IEnumerable sql = from info in db.Salt_Encryption select info; return sql; } }}
4.然后新建一个名为Test2Salt的Web客户端(用于测试),先引用创建的WCF服务,具体过程见,然后进行Web端的代码编写:
(1)Test2SaltForm.aspx(Web界面代码)<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test2SaltForm.aspx.cs" Inherits="Test2Salt.Test2SaltForm" %>
(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值,对你输入的密码进行加密,然后和数据库中的密码进行对比就可以了。