当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 详解对密码执行散列和 salt 运算方法

ASP.NET
Internet Explorer 编程简述(二)在IE中编辑OLE嵌入文档
移动窗体
.NET 2.0获取数据库连接统计数据
VB.NET 拖动无边框的窗体
利用WH_CBT Hook将非模态对话框显示为模态对话框
Aspect#应用 - 权限验证
VB 从零开始编外挂(一)
【错误解决】Unable to find script library 'WebUIValidation.js'
VB 从零开始编外挂(四)
DTD指南(3)-DTD-Elements(元素)
知识库文章MDL9745154-File:Microsoft Visual Basic 运行时库
.net手机软件开发(六)OBEX应用:文件传输部分
在winform中使用WebBrowser控件时怎样去除IE的滚动条
WINZIP及WINRAR命令!!!!!
智能客户端相关Application Block结构功能分析(二)
如何在VB中操作EXCEL(一段代码,两个可以使用的过程)
在C#中用最简洁有效的代码执行存储过程并返回数据
.Net的Collection类的一些使用说明
ASP.NET实现数据图表c
用asp.net画饼图

ASP.NET 中的 详解对密码执行散列和 salt 运算方法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 115 ::
收藏到网摘: n/a

  大家对密码执行散列和Salt运算一定不陌生。两个Visual Studio企业版示例都是用的这个方法来加密这个方法的。结合示例代码,我总结了一个包含对密码进行加密,比较等静态方法的类。
  使用说明:先用HashAndSalt方法对密码进行加密,然后存储到数据库中。 在用户登录时用ComparePasswords方法在对用户输入的密码和用户注册时存储在数据库中的密码进行比较,判断用户输入的密码是否正确。

 

Credentials.cs

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
 
namespace BookStore.Common
{
       /// <summary>
       /// Credentials 的摘要说明。
       /// 原理:
       /// 对密码执行散列运算
       /// 若要避免以明文形式存储密码,一种常见的安全做法是对密码执行散列运算。如以下代码所示,使用 System.Security.Cryptography 命名空间(它实现 160 位 SHA-1 标准)对密码进行散列运算。有关更多信息,请参见 SHA1 成员。
       /// 对散列执行 Salt 运算
       /// 虽然对密码执行散列运算的一个好的开端,但若要增加免受潜在攻击的安全性,则可以对密码散列执行 Salt 运算。Salt 就是在已执行散列运算的密码中插入的一个随机数字。这一策略有助于阻止潜在的攻击者利用预先计算的字典攻击。字典攻击是攻击者使用密钥的所有可能组合来破解密码的攻击。当您使用 Salt 值使散列运算进一步随机化后,攻击者将需要为每个 Salt 值创建一个字典,这将使攻击变得非常复杂且成本极高。
       /// Salt 值随散列存储在一起,并且未经过加密。所存储的 Salt 值可以在随后用于密码验证。
       /// </summary>
       public class Credentials
       {
              private static string key = "!48%0d-F=cj>,s&2";  //密钥(增加密码复杂度,好像比较多余)
              private const int saltLength = 4;                         //定义salt值的长度
 
              /// <summary>
              /// 对密码进行Hash 和 Salt
              /// </summary>
              /// <param name="Password">用户输入的密码</param>
              /// <returns></returns>
              public static byte[] HashAndSalt(string Password)
              {
                     return CreateDbPassword(HashPassword(Password));
              }
 
              /// <summary>
              /// 对用户输入的密码加上密钥key后进行SHA1散列
              /// </summary>
              /// <param name="Password">用户输入的密码</param>
              /// <returns>返回 160 位 SHA-1 散列后的的byte[](160位对应20个字节)</returns>