zoukankan      html  css  js  c++  java
  • 哈希(Hash)与加密(Encrypt)相关内容

    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开始对其使用哈希,将获得的哈希值与目标比较,若相同,则此值就是目标哈希值的一个碰撞,即被破译。

     1 using System;
     2 using System.Web.Security;
     3  
     4 namespace HashAndEncrypt
     5 {
     6     /// <summary>
     7     /// MD5攻击工具类
     8     /// </summary>
     9     public sealed class MD5AttackHelper
    10     {
    11         /// <summary>
    12         /// 对MD5进行穷举攻击
    13         /// </summary>
    14         /// <param name="hashString">杂凑串</param>
    15         /// <returns>杂凑串的源串或源串碰撞(攻击失败则返回null)</returns>
    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     /// <summary>
     7     /// 多重混合哈希工具类
     8     /// </summary>
     9     public sealed class HashHelper
    10     {
    11         private static readonly String hashKey = "qwer#&^Buaa06";
    12         /// <summary>
    13         /// 对敏感数据进行多重混合哈希
    14         /// </summary>
    15         /// <param name="source">待处理明文</param>
    16         /// <returns>Hasn后的数据</returns>
    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

  • 相关阅读:
    选择学习Web前端开发的理由
    在Nginx下部署SSL证书并重定向至HTTPS
    使用pm2快速将项目部署到远程服务器
    DNS域名解析过程
    HTML5新特性总结
    基于 HTML5 Canvas 的智能安防 SCADA 巡逻模块
    react中使用css的7种方式
    原生JS实现滑动轮播图
    H5与企业微信jssdk集成
    img图片不存在显示默认图
  • 原文地址:https://www.cnblogs.com/zhenggege/p/6123479.html
Copyright © 2011-2022 走看看