C# salt+hash 加密
1 先明确几个基本概念
(1)伪随机数:pseudo-random number generators ,简称为:PRNGs,是计算机利用一定的算法来产生的。伪随机数并不是假随机
数,这里的“伪”是有规律的意思,就 是计算机产生的伪随机数既是随机的又是有规律的。怎样理解呢?产生的伪随机数有时遵守一定的规律,有
时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正是点到了事
物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。从这个角度讲,你大概就会接受这样的事实了:计算机
只能产生伪随机数而不能产生绝对随机的随机数。
(2)真随机数:true random number generators ,简称为:TRNGs,是利用不可预知的物理方式来产生的随机数。
(3)明文:原始密码,未经过任何算法加密的密码。
(4)密文:原始密码经过某种算法加密后,形成的密码。
2 C# salt+hash加密规则
规则:salt伪随机值+原始密码,即salt伪随机值与原始密码组合成明文,然后经过hash算法形成密文,如:
假设salt产生的伪随机数为:9de74893-0b41-4f4e-91dc-06f62241b8bc
原始明文为:admin
组合规则:原始明文+salt伪随机值,即admin9de74893-0b41-4f4e-91dc-06f62241b8bc
hash加密后密文:urfFO/IWz912E2GXL4KiCzbosuZ6TdLpMk7lDRVVdYk=
数据库表结果如下:
3 C# salt产生伪随机数原理
第一步:引入命名空间 using System;
第二步:调用结构体Guid的NewGuid()方法;
第三步:代码表示 string strSalt = Guid.NewGuid().ToString();
注释:当然,也可以调用类Random下的方法来产生伪随机数。
4 hash原理
hash是一种不可逆加密算法,C# HASH算法比较多,列举几种如下:
(1)MD5
(2)SHA家族:这里顺便提一下,美国政府以前广泛采用SHA-1算法,在2005年被我国山东大学的王小云教授发现了安全漏洞,所以现在比较常
用SHA-1加长的变种,比如SHA-256。在.NET中,可以使用SHA256Managed类
(3)关键代码如下:
protected void btnRegister_Click(object sender, EventArgs e)
{
//用户名和密码
string userName = this.TextBoxUserName.Text;
string userPwd = this.TextBoxPWD.Text;
//salt
string strSalt= Guid.NewGuid().ToString(); //SHA256加密
byte[] pwdAndSalt = Encoding.UTF8.GetBytes(userPwd + strSalt);
byte[] hashBytes = new SHA256Managed().ComputeHash(pwdAndSalt);
string hashStr = Convert.ToBase64String(hashBytes); StringBuilder strBuid = new StringBuilder();
strBuid.Append("INSERT INTO userInfo(");
strBuid.Append("userName,userPassword,salt) values(");
strBuid.Append("@userName,@hashStr,@strSalt)");
SqlParameter[] sqlpara = {
new SqlParameter("@userName",SqlDbType.NVarChar,),
new SqlParameter("@hashStr",SqlDbType.NVarChar,),
new SqlParameter("@strSalt",SqlDbType.NVarChar,)
};
sqlpara[].Value = this.TextBoxUserName.Text;
sqlpara[].Value = hashStr;
sqlpara[].Value = strSalt;
//获取连接字符串
string sqlConStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString; using (SqlConnection con=new SqlConnection(sqlConStr))
{
con.Open();
SqlCommand cmd = new SqlCommand(strBuid.ToString(),con);
cmd.Parameters.AddRange(sqlpara);
if (cmd.ExecuteNonQuery()>)
{
Response.Write("<script>alert('注册成功!')</script>");
}
else
{
Response.Write("<script>alert('注册失败!')</script>");
} }
}
5 C#常见加密算法
MD5加密、SHA家族加密、RSA加密、DES加密,目前主流加密为RSA,如数字签名等,在本篇博客中,就不论述,以后会对这四类算法作详细论述。
6 常见密码破解算法
最简单、常见的破解方式当属字典破解(Dictionary Attack)和暴力破解(Brute Force Attack)方式。这两种方法说白了就是猜密码。
字典破解和暴力破解都是效率比较低的破解方式。如果你知道了数据库中密码的哈希值,你就可以采用一种更高效的破解方式,查表法(Lookup Tables)。还有一些方法,比如逆向查表法(Reverse Lookup Tables)、彩虹表(Rainbow Tables)等,都和查表法大同小异。现在我们来看一下查表法的原理。
查表法不像字典破解和暴力破解那样猜密码,它首先将一些比较常用的密码的哈希值算好,然后建立一张表,当然密码越多,这张表就越大。当你知道某个密码的哈希值时,你只需要在你建立好的表中查找该哈希值,如果找到了,你就知道对应的密码了。
7 为什么使用hash来加密
如果你需要保存密码(比如网站用户的密码),你要考虑如何保护这些密码数据,象下面那样直接将密码写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码。
解决的办法是将密码加密后再存储进数据库,比较常用的加密方法是使用哈希函数(Hash Function)。哈希函数的具体定义,大家可以在网上或者相关书籍中查阅到,简单地说,它的特性如下:
(1)原始密码经哈希函数计算后得到一个哈希值
(2)改变原始密码,哈希函数计算出的哈希值也会相应改变
(3) 同样的密码,哈希值也是相同的
(4) 哈希函数是单向、不可逆的。也就是说从哈希值,你无法推算出原始的密码是多少
有了哈希函数,我们就可以将密码的哈希值存储进数据库。用户登录网站的时候,我们可以检验用户输入密码的哈希值是否与数据库中的哈希值相同。
由于哈希函数是不可逆的,即使有人打开了数据库,也无法看到用户的密码是多少。
那么存储经过哈希函数加密后的密码是否就是安全的了呢?参照六、发现并不安全,只有加上salt才安全,因为salt是随机生成的。
8 版权
- 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
- 博主网址:http://www.cnblogs.com/wangjiming/。
- 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
- 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2016177728@qq.com。
- 可以转载该博客,但必须著名博客来源。
C# salt+hash 加密的更多相关文章
- python提供了一个进行hash加密的模块:hashlib
python提供了一个进行hash加密的模块:hashlib下面主要记录下其中的md5加密方式 import hashlib data1 = 'sada' #####字母和数字 m = hashlib ...
- shiro入门学习--使用MD5和salt进行加密|练气后期
写在前面 在上一篇文章<Shiro入门学习---使用自定义Realm完成认证|练气中期>当中,我们学会了使用自定义Realm实现shiro数据源的切换,我们可以切换成从关系数据库如MySQ ...
- Python中hash加密
目录 简介 概念 特点 hash有哪些 算法碰撞 加盐防碰撞 加密 hashlib 主要方法 特有方法 使用方法 加盐 crypt 主要方法 使用说明 应用 密码加密 应用一致性校验 简介 概念 散列 ...
- 关于MD5+salt盐加密
MD5+salt 最近浏览浏览一些帖子时,发现曾经引以为傲的md5加密算法,虽然是无法解密的算法,但是现在可以通过FELHELP(谷歌浏览器插件)或者一些字典可以套出来,.但是当md5+salt值时, ...
- MD5加密与Hash加密
一.Md5加密 MD5算法具有以下特点: 1.压缩性:任意长度的数据,算出的MD5值长度都是固定的. 2.容易计算:从原数据计算出MD5值很容易. 3.抗修改性:对原数据进行任何改动,哪怕只修改1个字 ...
- 快速识别Hash加密方式hashid
快速识别Hash加密方式hashid hashid工具是用来识别不同类型的散列加密,进而判断哈希算法的类型.该工具的而语法格式如下所示: hashid [option] INPUT 其中,option ...
- 探究公钥、私钥、对称加密、非对称加密、hash加密、数字签名、数字证书、CA认证、https它们究竟是什么,它们分别解决了通信过程的哪些问题。
一.准备 1. 角色:小白.美美.小黑. 2. 剧情:小白和美美在谈恋爱:小黑对美美求而不得.心生怨念,所以从中作梗. 3. 需求:小白要与美美需通过网络进行通信,联络感情,所以必须保证通信的安全性. ...
- Web安全--使用Salt + Hash将密码加密后再存储进数据库
转载原地址 http://www.bozhiyue.com/mianshiti/_net/2016/0728/314239.html (一) 为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站 ...
- 转载 C#使用Salt + Hash来为密码加密
转载 http://www.csharpwin.com/csharpspace/13412r9615.shtml (一) 为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站用户的密码),你要考 ...
随机推荐
- 第一个shell脚本
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...
- [版本控制之道] Git 常用的命令总结(欢迎收藏备用)
坚持每天学习,坚持每天复习,技术永远学不完,自己永远要前进 总结日常开发生产中常用的Git版本控制命令 ------------------------------main-------------- ...
- C#异步编程(二)
async和await结构 序 前篇博客异步编程系列(一) 已经介绍了何谓异步编程,这篇主要介绍怎么实现异步编程,主要通过C#5.0引入的async/await来实现. BeginInvoke和End ...
- H5坦克大战之【玩家控制坦克移动2】
周一没有看圣诞大战,这几天比较忙也没有看赛后的报道,今天就先不扯NBA,随便扯扯自己.昨天在电脑里找东西的时候翻到以前兼职健身教练时的照片,思绪一下子回到学生时代,脑子久久换不过来.现在深深觉得健身和 ...
- php报错 ----> Call to undefined function imagecreatetruecolor()
刚才在写验证码的时候,发现报错,然后排查分析了一下,原来是所用的php版本(PHP/5.3.13)没有开启此扩展功能. 进入php.ini 找到extension=php_gd2.dll ,将其前面的 ...
- MySQL: Fabric 搭建 HA
搭建好Fabric之后,就可以在它的基础上创建HA Group. Shard Group.HA+Shard Group等.这里来说明一下如何快速的搭建HA环境. Fabric 192.168.2.23 ...
- Princeton Algorithms week3 Assignment
这周编程作业是实现检测点共线的算法.和排序算法有关系的地方在于,对斜率排序后可以很快的检测出来哪些点是共线的,另外这个算法的瓶颈也在于排序的性能. 一点收获: java传参数时传递的是值,这很多人都知 ...
- 学习笔记:delphi之TStringGrid
1.说明 最近加入了一个项目组,使用的开发工具是delphi6,想想又要开始搞这个工具有点小忧伤,但没办法谁让咱就是个打杂的尼... 的需求是显示一个类似于Word/excel的那种表格,可以合并列等 ...
- 超炫的HTML5粒子效果进度条 VS 如何规范而优雅地code
最近瞎逛的时候发现了一个超炫的粒子进度效果,有多炫呢?请擦亮眼镜! // _this.ch){ _this.particles.splice(i, 1); } }; this.Particle.p ...
- ABP源码分析十二:本地化
本文逐个分析ABP中涉及到locaization的接口和类,以及相互之间的关系.本地化主要涉及两个方面:一个是语言(Language)的管理,这部分相对简单.另一个是语言对应得本地化资源(Locali ...