基于SHA-256的HMAC文件校验器

2016-01-29 12:14 42 1 收藏

基于SHA-256的HMAC文件校验器,基于SHA-256的HMAC文件校验器

【 tulaoshi.com - C语言心得技巧 】

基于SHA-256的HMAC文件校验器

作者:Gamsn

下载源代码

  HMAC即带密钥的HASH函数,用它产生的报文鉴别码(MAC)可以实现报文鉴别。这里我将其做成一个软件,用于对文件的合法性进行校验。以下我先简单介绍软件相关背景知识再介绍其代码实现。

一、背景知识简介
  有时候进行通信的双方基于安全的考虑需要对对方发过来的消息进行校验,以确定消息是未经第三方修改过的。这种校验可以这样进行: 双方共同约定一个密钥(即一个密码),这个密钥是对第三方保密的;消息的发方使用该密钥对将发送的消息产生一个校验码,并把该校验码附在消息后一起发出;消息的接收方在接收到附有校验码的消息后,将消息和校验码分开,用密钥对该消息生成一个校验码;然后将两个校验码相比较,如果相同的话则说明消息是未经第三方修改的,如果不同的话说明消息很可能被非法修改过(当然也有可能是别的原因使消息改变了)则该消息不可信,需要对方重发;

 *其中,生成校验码的算法一般采用HMAC,它保证了第三方在不知密钥的情况下,不可能在修改消息后可以同时修改校验码使之与修改后的消息匹配。
 *在整个过程中消息是公开的(未经加密的),算法只提供消息的完整性校验而不提供保密性,保密性可由公钥加密算法现实,这里不作讨论。

二、软件的实现
  我做的该软件是可以对电脑磁盘上的任意一文件生成一校验文件.vri(密钥由用户自己输入),根据该校验文件可以在需要之时对相应的文件进行校验。具体做法将在后面的例子中给出。
  程序中的HMAC算法的HASH函数我采用的是SHA-256算法,它比起MD5和SHA-1来要安全。(其实因为不是正式的安全产品,所以在本程序中采用MD5或SHA-1也未尝不可)。

*HMAC的结构如下图所示:
 

图一 HMAC的结构

图中各符号定义如下:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)
IV =作为HASH函数输入的初始值 M  =HMAC的消息输入 Yi =M的第i个分组,0<=i<=(L-1) b  =每一分组所含的位数 n  =嵌入的HASH函数所产生的HASH码长 K  =密钥 K+ =为使K为b位长而在K左边填充0后所得的结果 ipad =0x36重复b/8次的结果 opad =0x5c重复b/8次的结果 

  对于特定的HASH函数,b、n都是固定的,所以在程序的HMAC类中,n被定义为宏Mn,b被定义为Mb,值分别为32和64。由于该结构的效率较低,不利于实用化。于是有人提出了一个HMAC的高效实现方案。

*HMAC的有效实现方案如下:


图二 HMAC的有效实现方案

其中的HASH即为SHA-256。

图中左边所示为预计算,右边为对每条消息的计算。在密钥不变的情况下只需进行一次预计算,以后在产生校验码时就只用到右边的计算了。这样就可以提高效率。
  需要说明的是,大家在阅读我写的HMAC的类可能会发现,在每次计算时都进行了左右两边的计算(不论密钥怎样)。这是因为我考虑到个人用户可能会不时地对密钥进行更换,并且应用场合也不对效率有特别的要求。当然这样做并没有体现出HMAC有效实现方案的优点。
  另外还有一点就是我对密钥的填充是填充的低位,即密钥右边,这和上述方案有不同(方案上说是要填充在高位,即左边),在此说明,以使大家在看源代码的时候不至于疑惑。
  以上有效实现方案在HMac类中现实,HASH函数sha-256在Sha256类中实现。由于这里主要说的是HMAC,sha-256只是作为一个黑盒子,所以不多解释。
  程序中的Mac类与HAMC和HASH函数都无关,只是一个存放结果的介质,它甚至都没有成员函数,我也在考虑是不是可以不把它做成一个类。

为了便于读者阅读HMac类中的各变量基本上采用图二中的各标识符标识。

对于下面一段代码读者可能会有疑惑,明明是该得到第一个预计算的结果,m_dwA1—m_dwH1是什么呢?

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)
for(i=0;i<Mb;i++)    S[i]=sKeyplus[i]^ipad[i];m_sha256.Init(Mb);m_sha256.GenW(S,Mb);m_sha256.Steps();m_dwA1=m_sha256.OA;m_dwB1=m_sha256.OB;m_dwC1=m_sha256.OC;m_dwD1=m_sha256.OD;m_dwE1=m_sha256.OE;m_dwF1=m_sha256.OF;m_dwG1=m_sha256.OG;m_dwH1=m_sha256.OH;   
  其实m_dwA1—m_dwH1就是第一个预计算的输出。这里因为这个输出有256位,于是我把它拆成了8个32位。同理,第二个预计算的输出为m_dwA2—m_dwH2。
  此外,程序中关于文件拖

来源:http://www.tulaoshi.com/n/20160129/1485172.html

延伸阅读
1.校验日期 <script language=javascript function isDate(str) { var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); if(r==null)return false; var d = new Date(r, r-1, r); return (d.getFullYear()==r&&(d.getMonth()+1)==r&&d.getDate()==r); } alert(isDate("2002-01-31")); alert(isDate("2002-01-41")...
标签: Web开发
xhEditor是一个基于jQuery开发的简单迷你并且高效的可视化XHTML编辑器,基于网络访问并且兼容IE 6.0+,Firefox 3.0+,Opera 9.6+,Chrome 1.0+,Safari 3.22+。 xhEditor完全基于Javascript开发,您可以应用在任何的服务端语言环境下,例如:PHP、ASP、ASP.NET、JAVA等。 xhEditor可以在您的CMS、博客、论坛、商城等互联网平台上完美的嵌入运行...
一、前言 当前Visual C++相关的编程资料中,无论是大部头的参考书,还是一些计算机杂志,对声音文件的处理都是泛泛的涉及一下,许多编程爱好者都感到对该部分的内容了解不是很透彻,本文希望能够给刚刚涉及到声音处理领域的朋友们起到一个引路的作用,帮助他们尽快进入声音处理的更深奥空间。 当前计算机系统处理声音文件有两种办法:一是使...
标签: Web开发
用过新浪微博的朋友对它的头像编辑器都有印象吧.不过人家是用flash做的. 在一个项目中,也用到了同样的东西,本来想直接用新浪微博的,但它有一部分请求路径写到FLASH里面去了,所以只好放弃. 在网上找到了jquery.Jcrop,基本满足了我的需求,但它只是简单的切割而已,还有缩略图没有生成.或许有很多人都需要这类东西吧,于是我把它封装起来了,方便其...
标签: ASP
  <html <head <meta http-equiv="Content-Type" content="text/html; charset=gb2312" <meta name="GENERATOR" content="Microsoft FrontPage 4.0" <meta name="ProgId" content="FrontPage.Editor.Document" <titleNew Page 1</title </he...

经验教程

863

收藏

89
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部