博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
哈希(Hash)与加密(Encrypt)相关内容
阅读量:5118 次
发布时间:2019-06-13

本文共 3319 字,大约阅读时间需要 11 分钟。

1、哈希(Hash)与加密(Encrypt)的区别

哈希(Hash)是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的、可逆的密文。

      i.哈希算法往往被设计成生成具有相同长度的文本,而加密算法生成的文本长度与明文本身的长度有关。

      例:设我们有两段文本:“Microsoft”和“Google”。两者使用某种哈希算法得到的结果分别为:“140864078AECA1C7C35B4BEB33C53C34”和“8B36E9207C24C76E6719268E49201D94”,而使用某种加密算法的到的结果分别为“Njdsptpgu”和“Hpphmf”。可以看到,哈希的结果具有相同的长度,而加密的结果则长度不同。实际上,如果使用相同的哈希算法,不论你的输入有多么长,得到的结果长度是一个常数,而加密算法往往与明文的长度成正比。

      ii.哈希算法是不可逆的,而加密算法是可逆的。

      这里的不可逆有两层含义,一是“给定一个哈希结果R,没有方法将E转换成原目标文本S”,二是“给定哈希结果R,即使知道一段文本S的哈希结果为R,也不能断言当初的目标文本就是S”。加密则不同,给定加密后的密文R,存在一种方法可以将R确定的转换为加密前的明文S。

2、哈希(Hash)与加密(Encrypt)的选择

如果被保护数据仅仅用作比较验证,在以后不需要还原成明文形式,则使用哈希;如果被保护数据在以后需要被还原成明文,则需要使用加密。

3、简单的一次哈希(Hash)

当前最常用的哈希(Hash)算法为MD5和SHA1

using System;using System.Web.Security; namespace HashAndEncrypt{    ///     /// 哈希(Hash)工具类    ///     public sealed class HashHelper    {        ///         /// 使用MD5算法进行哈希        ///         /// 源字串        /// 
杂凑字串
public static string MD5Hash(string source) { return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "MD5"); } /// /// 使用SHA1算法进行哈希 /// /// 源字串 ///
杂凑字串
public static string SHA1Hash(string source) { return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "SHA1"); } }}

4、对简单的一次哈希(Hash)的攻击

主要有寻找碰撞法和穷举法。

      i.寻找碰撞法:若能找出与要破译的口令的哈希值相等的口令即可。但目前对于MD5和SHA1没有有效的寻找碰撞法。

      ii.穷举法:假设攻击范围为000000-999999,从000000开始对其使用哈希,将获得的哈希值与目标比较,若相同,则此值就是目标哈希值的一个碰撞,即被破译。

1 using System; 2 using System.Web.Security; 3   4 namespace HashAndEncrypt 5 { 6     ///  7     /// MD5攻击工具类 8     ///  9     public sealed class MD5AttackHelper10     {11         /// 12         /// 对MD5进行穷举攻击13         /// 14         /// 杂凑串15         /// 
杂凑串的源串或源串碰撞(攻击失败则返回null)
16 public static string AttackMD5(string hashString)17 {18 for (int i = 0; i <= 999999; i++)19 {20 string testString = i.ToString();21 while (testString.Length < 6)22 testString = "0" + testString;23 24 if (FormsAuthentication.HashPasswordForStoringInConfigFile(testString, "MD5") == hashString)25 return testString;26 }27 28 return null;29 }30 }31 }
此法容易破译那些简单口令例如“000000”或“123456”等。

5、多重混合哈希(Hash)

为了避免简单口令被穷举法破译,使用多重混合哈希:

假设字符串key,目标口令A的哈希值R=SHA1(MD5(A)*MD5(key))

1 using System; 2 using System.Web.Security; 3   4 namespace HashAndEncrypt 5 { 6     ///  7     /// 多重混合哈希工具类 8     ///  9     public sealed class HashHelper10     {11         private static readonly String hashKey = "qwer#&^Buaa06";12         /// 13         /// 对敏感数据进行多重混合哈希14         /// 15         /// 待处理明文16         /// 
Hasn后的数据
17 public static String Hash(String source)18 {19 String hashCode = FormsAuthentication.HashPasswordForStoringInConfigFile(source, "MD5") +20 FormsAuthentication.HashPasswordForStoringInConfigFile(hashKey, "MD5");21 return FormsAuthentication.HashPasswordForStoringInConfigFile(hashCode, "SHA1");22 }23 }24 }

 

 

*整理来源:http://www.cnblogs.com/leoo2sk/archive/2010/10/01/hash-and-encrypt.html

转载于:https://www.cnblogs.com/zhenggege/p/6123479.html

你可能感兴趣的文章
第一个Java Web程序
查看>>
树状数组_一维
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
嵌入式软件设计第8次实验报告
查看>>
算法和数据结构(三)
查看>>
Ubuntu下的eclipse安装subclipse遇到没有javahl的问题...(2天解决了)
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
WCF揭秘——使用AJAX+WCF服务进行页面开发
查看>>
【题解】青蛙的约会
查看>>
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>
面向对象的设计原则
查看>>
Swift3.0服务端开发(三) Mustache页面模板与日志记录
查看>>
【转】 FPGA设计的四种常用思想与技巧
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
新手算法学习之路----二叉树(在一个二叉查找树中插入一个节点)
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>