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
{
/// <summary>
/// 哈希(Hash)工具类
/// </summary>
public sealed class HashHelper
{
/// <summary>
/// 使用MD5算法进行哈希
/// </summary>
/// <param name="source">源字串</param>
/// <returns>杂凑字串</returns>
public static string MD5Hash(string source)
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "MD5");
} /// <summary>
/// 使用SHA1算法进行哈希
/// </summary>
/// <param name="source">源字串</param>
/// <returns>杂凑字串</returns>
public static string SHA1Hash(string source)
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "SHA1");
}
}
}

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

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

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

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

 using System;
using System.Web.Security; namespace HashAndEncrypt
{
/// <summary>
/// MD5攻击工具类
/// </summary>
public sealed class MD5AttackHelper
{
/// <summary>
/// 对MD5进行穷举攻击
/// </summary>
/// <param name="hashString">杂凑串</param>
/// <returns>杂凑串的源串或源串碰撞(攻击失败则返回null)</returns>
public static string AttackMD5(string hashString)
{
for (int i = ; i <= ; i++)
{
string testString = i.ToString();
while (testString.Length < )
testString = "" + testString; if (FormsAuthentication.HashPasswordForStoringInConfigFile(testString, "MD5") == hashString)
return testString;
} return null;
}
}
}
此法容易破译那些简单口令例如“000000”或“123456”等。

5、多重混合哈希(Hash)

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

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

 using System;
using System.Web.Security; namespace HashAndEncrypt
{
/// <summary>
/// 多重混合哈希工具类
/// </summary>
public sealed class HashHelper
{
private static readonly String hashKey = "qwer#&^Buaa06";
/// <summary>
/// 对敏感数据进行多重混合哈希
/// </summary>
/// <param name="source">待处理明文</param>
/// <returns>Hasn后的数据</returns>
public static String Hash(String source)
{
String hashCode = FormsAuthentication.HashPasswordForStoringInConfigFile(source, "MD5") +
FormsAuthentication.HashPasswordForStoringInConfigFile(hashKey, "MD5");
return FormsAuthentication.HashPasswordForStoringInConfigFile(hashCode, "SHA1");
}
}
}

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

哈希(Hash)与加密(Encrypt)相关内容的更多相关文章

  1. 哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用

    0.摘要 今天看到吉日嘎拉的一篇关于管理软件中信息加密和安全的文章,感觉非常有实际意义.文中作者从实践经验出发,讨论了信息管理软件中如何通过哈希和加密进行数据保护.但是从文章评论中也可以看出很多朋友对 ...

  2. 【转】哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用

    0.摘要 今天看到吉日嘎拉的一篇关于管理软件中信息加密和安全的文章,感觉非常有实际意义.文中作者从实践经验出发,讨论了信息管理软件中如何通过哈希和加密进行数据保护.但是从文章评论中也可以看出很多朋友对 ...

  3. 复习做UWP时涉及到的几种加密签名相关

    本人菜鸟一枚,大学里凭兴趣学了一点WP的皮毛,后来又幸运(或者不幸)的进了一家专注于Windows生态的公司做了一段时间的UWP.在博客园写点自己遇到的东西,作为分享,也作为自己的备忘,如果有错误的地 ...

  4. 有关https安全的相关内容介绍

    Https 介绍什么是Https HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道.简单讲是H ...

  5. C# 通过比对哈希码判断两个文件内容是否相同

    1.使用System.security.Cryptography.HashAlgorithm类为每个文件生成一个哈希码,然后比较两个哈希码是否一致. 2. 在比较文件内容的时候可以采用好几种方法.例如 ...

  6. 哈希hash

    定义 是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值 生成方法 hash() 哈希特性 不可逆 :在具备编码功能的同时,哈希算法也作为一种加密算 ...

  7. 区块链 - 哈希(Hash)

    章节 区块链 – 介绍 区块链 – 发展历史 区块链 – 比特币 区块链 – 应用发展阶段 区块链 – 非对称加密 区块链 – 哈希(Hash) 区块链 – 挖矿 区块链 – 链接区块 区块链 – 工 ...

  8. linux用户权限相关内容查看

    linux用户权限相关内容查看 1   用户信息 创建用户一个名为 webuser 的账号,并填写相应的信息: root@iZ94fabhqhuZ:~# adduser webuser Adding ...

  9. 简单讲解iOS应用开发中的MD5加密的相关使用<转>

    这篇文章主要介绍了iOS应用开发中的MD5加密的相关使用,示例代码基于传统的Objective-C,需要的朋友可以参考下 一.简单说明 1.说明 在开发应用的时候,数据的安全性至关重要,而仅仅用POS ...

  10. 简单讲解iOS应用开发中的MD5加密的相关使用

      简单讲解iOS应用开发中的MD5加密的相关使用   作者:文顶顶 字体:[增加 减小] 类型:转载 时间:2015-12-19 我要评论 这篇文章主要介绍了iOS应用开发中的MD5加密的相关使用, ...

随机推荐

  1. php 面试题收集-基础题

    1.表单中 get与post提交方法的区别?答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息. 2.session与cookie的区别?答:s ...

  2. 如何实现textarea中获取动态剩余字数的实现

    工作中遇到一个案例,之前没有写过,今儿啃了半个下午硬是给写出来,灰常又成就感!当然对于js大牛来说这根本不算啥,但是对于我自己的js能力又向前迈出一小步. 案例介绍:我们常见到有的网站有textare ...

  3. phpmyadmin 长时间登陆不过期

    一个小技巧:  在项目开发过程中,经常使用phpmyadmin,默认情况下,一段时间不操作,就需要重新登陆,如果要长时间使用,操作如下:    修改config.inc.php中的$cfg['Serv ...

  4. C# Bitmap 复制

    以后再详述,先上代码. public bool CopyBitmap(Bitmap source, Bitmap destination) { if ((source.Width != destina ...

  5. Thrift入门及Java实例演示<转载备用>

    Thrift入门及Java实例演示 作者: Michael 日期: 年 月 日 •概述 •下载配置 •基本概念 .数据类型 .服务端编码基本步骤 .客户端编码基本步骤 .数据传输协议 •实例演示(ja ...

  6. daydayup3 codeforces144C

    上古的c还是很简单的,一直逗比忘记加EOF了,直到看了数据才发现 题意:给你两个字符串a,b,求问字符串a里有多少个子串排列后可以生成字符串b,‘?’可以替换为任意小写字母 思路:统计第一个子字符串小 ...

  7. Flapper Bird的学习笔记(三)

    因为我有一个超屌的梦想,所以就绝不会做一个孬种的追梦人! 完成音效的添加 单例模式 游戏的状态切换 1. 单例模式 首先呢,说一下单例模式.何为单例?单例模式是一种常用的软件设计模式.在它的核心结构中 ...

  8. bzoj 3529: [Sdoi2014]数表

    #include<cstdio> #include<iostream> #include<algorithm> #define M 200009 //#define ...

  9. Bootstrap<基础二> 网格系统

    Bootstrap 提供了一套响应式.移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 什么是网格(Grid)? 摘自维基百科: 在平面设计中,网格 ...

  10. JSP之->初识JSP

    JSP 引用百度百科的介绍: JSP(Java Server Pages)是由Sun Microsystems公司倡导.许多公司参与一起建立的一种动态网页技术标准.JSP技术有点类似ASP技术,它是在 ...