热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析:MD5与SHA1哈希算法的应用与安全性分析

本文深入探讨了MD5与SHA1哈希算法在实际应用中的表现及其安全性。通过对这两种算法的详细分析,揭示了它们在数据完整性验证和密码存储等方面的优势与局限。文章不仅介绍了算法的基本原理,还讨论了近年来针对这些算法的安全性攻击,并提出了改进措施和替代方案。希望读者能够通过本文对哈希算法有更全面的理解。

近来想学习函数式编程。

但是一直不知道怎么展开这个学习过程,目前的研究进度也不深入,想讲解一些原理也无从下手。

先简单的上一些算法,逐步分析语法和思想。虽然程度不深,但至少能记录这个过程。

本例子用F#编写,是一种强类型,非纯函数式编程语言,在.net平台上运行,实际上为了兼容.net平台,你可以使用各种.net的基本类型和库。

C#的测试结果,从结果上看没有问题。

 

F#源码

 1 namespace Heron.Helpers
 2 
 3 open System.Text
 4 open System.Security.Cryptography
 5 
 6 module Encrypt =
 7     let Sha1Hash (str : string) = 
 8         let sha1 = SHA1.Create ()
 9         let sha1arr = sha1.ComputeHash (Encoding.UTF8.GetBytes (str))
10         let sha1str = String.concat "" (Array.init 20 (fun i -> sprintf "%02x" sha1arr.[i]))
11         sha1str
12 
13     let Md5Hash (str : string) =
14         let md5 = MD5.Create ()
15         let md5arr = md5.ComputeHash (Encoding.UTF8.GetBytes (str))
16         let md5str = String.concat "" (Array.init 16 (fun i -> sprintf "%02x" md5arr.[i]))
17         md5str

短短数行就完成,是不是很简洁呢。

 

namespace Heron.Helpers

open System.Text
open System.Security.Cryptography

/// 这段不用多说,namespace和C#中的功能一样,声明命名空间。
/// open相当于using ,导入一个命名空间
module Encrypt =
/// 这里的module是用来区分个模块功能的,对程序意义不大,在C#里被当作一个静态类处理兼容。F#是缩进敏感的语言,缩进比这段语句多一层的都属于这个模块下面的。所以下面的两个函数可以理解为这个模块的静态方法。
let Sha1Hash (str : string) = 
    let sha1 = SHA1.Create ()
    let sha1arr = sha1.ComputeHash (Encoding.UTF8.GetBytes (str))
    let sha1str = String.concat "" (Array.init 20 (fun i -> sprintf "%02x" sha1arr.[i]))
    sha1str

/// let是用来绑定一个标识符,可以是实数,可以是字符串,可以是对象,也可以是函数,这里绑定的就是一个函数,带有一个string类型的参数str,最后一行为返回值,这里就是返回sha1str这个标识。实际上纯函数语言里是没有变量的,也没有基本类型,所有的东西都是函数,比如 let a = 0,你可以理解为没有参数,返回int的函数。F#为了兼容.net平台,类型都是静态绑定,靠自动推算来得到类型。
/// 这里用到的F#特性不多,只有第4行用到一点。可能看起来有点晕,我们来分解一下
Array.init 20 (fun i -> sprintf "%02x" sha1arr.[i])
/// Array.init 这是一个函数,有两个参数,第一个表示返回的数组个数,第二个参数为一个匿名函数,就是括号里的内容(fun i -> sprintf "%02x" sha1arr.[i])。这个函数会迭代i 从0到19 刚好对应sha1arr的下标,然后一次转为16进制的数表示,不足的前面补零。
String.concat "" Array
/// 这个是把一个数组元素拼接为一个字符串的函数,第一个参数是拼接的符号,这里是空字符串,第二个参数是数组,就是上面生成的20个16进制的数。
/// 是不是代码简洁了很多呢

 

以后可能会陆续带来参数函数,返回值函数等高阶函数和泛型的随笔。不过我还是希望从实际数据着手,要有实际应用的空间。因为现在掌握的也不深,也没多少东西卖弄。

以后我会慢慢收集各种实用的算法,然后形成一个工具包,等实用度达到一定基础后会发布出来。不知道大家看好不。

如果大家有对函数编程的独特见解,也欢迎留言讨论。


推荐阅读
  • 本文详细介绍如何使用 Python 集成微信支付的三种主要方式:Native 支付、APP 支付和 JSAPI 支付。每种方式适用于不同的应用场景,如 PC 网站、移动端应用和公众号内支付等。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 获取计算机硬盘序列号的方法与实现
    本文介绍了如何通过编程方法获取计算机硬盘的唯一标识符(序列号),并提供了详细的代码示例和解释。此外,还涵盖了如何使用这些信息进行身份验证或注册保护。 ... [详细]
  • 在软件开发过程中,MD5加密是一种常见的数据保护手段。本文将详细介绍如何在C#中使用两种不同的方式来实现MD5加密:字符串加密和流加密。 ... [详细]
  • 在Java开发中,使用BASE64编码通常可以直接利用JDK内置的库。然而,在Android平台上,由于安全性和兼容性的考虑,直接引用JDK中的`sun.misc.BASE64Decoder`会导致错误,因此需要引入第三方库来实现相同的功能。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 在给定的数组中,除了一个数字外,其他所有数字都是相同的。任务是找到这个唯一的不同数字。例如,findUniq([1, 1, 1, 2, 1, 1]) 返回 2,findUniq([0, 0, 0.55, 0, 0]) 返回 0.55。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
author-avatar
平凡的如果爱166
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有