乐趣区

关于golang:趣谈HmacSHA1和原生SHA1的区别

首先来看一段 HmacSHA1 加密和 SHA1 加密的代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Created on 1/31/18 10:03 AM
@author: Chen Liang
@function: HmacSHA1 vs SHA1
"""

import sys

reload(sys)
sys.setdefaultencoding('utf-8')
import hashlib
import hmac


def sha1(msg):
    """
    sha1 加密
    :param msg:
    :return: 长度 40 位的摘要信息
    """
    sha = hashlib.sha1()
    sha.update(msg)
    return sha.hexdigest()


def hmac_sha1(key, msg):
    """
    hmac sha1 加密
    :param key: 密钥
    :param msg: 待加密音讯
    :return: 长度 40 位的摘要信息
    """
    m = hmac.new(key, msg, hashlib.sha1)
    return m.hexdigest()


print hmac_sha1('FKEwTiz9Te0FWlqkS4g8hEdqAsPZfdR4', 'me')
print sha1('me')

输入后果为

1db0e9132a8dff51e3a4d47497e29a500087da9a
b1c1d8736f20db3fb6c1c66bb1455ed43909f0d8

从后果中能够发现,HmacSHA1 算法和 SHA1 算法都能够为任意长的音讯生成一个 20 字节 (160bit) 的固定大小的输入,那么他们的区别在哪儿呢?

其实答案是很简略的。

在 HMAC vs. raw SHA- 1 这篇文章中有一个乏味的解释,翻译过去粗心如下

<!–more–>

写在后面,请不要在意具体的摘要计算结果,重点在于解释的趣味性和简洁明了

假如你想向你喜爱的人表白,你很想拿出一首漂亮的 14 行诗,然而最初你决定只说一句简略的"i love you"

你要表白的信息可能完整无缺的传播给喜爱的妹子,然而你又不想其余的人晓得,那么能够理解一些对于明码哈希的常识,应用 SHA- 1 算法从音讯中生成一个摘要。

"i love you"对应的 SHA- 1 摘要是:bb7b1901d99e8b26bb91d2debdb7d7f24b3158cf

你喜爱的妹子接管到音讯后,应用 SHA- 1 算法从新计算出摘要和你发送的摘要进行比拟。如果匹配就示意音讯正确。

然而总有那么些刁民打算拦挡你的信息,而后用另一个音讯 "don't call me anymore" 代替掉,而后生成一个全新的摘要:e267e18f05cb6ea3b10b761bbac21a0f92bb8d0d。你喜爱的妹子收到音讯之后摘要信息无奈匹配得上,都有些难以置信了。

事件看起来很严厉,然而你向妹子解释了一番,保障当前再也不会产生这样相似的事件,你和妹子约定在计算 hash 摘要信息时在音讯后面加上文本"our secret key.",也就是新的残缺的信息是"our secret key.i love you"。就这样雷同的音讯就会产生上面这样的摘要信息:

e0759e9b59bdd6d864d29ce3a502adb6257f7615,原文的这个值计算有错,评论中有提出。

这时候如果那些刁民只是简略的替换摘要信息就不失效了。因为你妹子应用 key+msg 的形式失去的后果和替换之后的摘要信息匹配不上。这样只有他人不晓得你的密钥就没有方法产生虚伪的音讯。

然而还有一个问题,问题在于 SHA- 1 和 HMAC 之间的区别。

SHA- 1 是应用迭代算法进行计算的,首先一个接一个地将音讯分成 64 个字节的块,而后把这些块组合在一起来产生 20 个字节的摘要信息。然而,因为你的音讯能够是任意长度的,并且因为 SHA 通过其迭代性质在 64 字节的块之后持续计算块,这时候问题就呈现了。

那些刁民打算再次扭转你的信息,他们可能只是将更多的数据增加你的音讯外面,因为你的密钥在后面的块中曾经通过了计算,这时候增加在前面的音讯不会受到你的密钥影响。

如果在音讯前面简略的增加上 ”but please don’t call me anymore”,计算新的摘要并发送给你喜爱的妹子,妹子会认为整段音讯就是你的意思。(此处具体计算方法须要参照 sha1 算法的实现)

就这样一个大写的 GG 刻在了你的脸上(欲哭无泪)!!!

然而也不必慌,咱们还有 HMAC,HMAC 解决了这个问题,HMAC 在整个 hash 过程中能无效的密封音讯暗藏密钥,并且不能在尾部追加数据。具体的解决办法参见 HMAC 的实现。

依据维基百科,没有发现任何已知的 HMAC 音讯扩大攻打。

祝贺你,妹子到手了,请开始你的性福之旅吧(啊呸,傻逼输入法,是幸福)!!!

到这里其实 HmacSHA1 加密和 SHA1 加密的区别就很显著了,心愿大家也都能了解。


参考:

  1. HMAC vs. raw SHA-1
  2. 极客学院 -hmac
  3. 极客学院 -hashlib

记得帮我点赞哦!

精心整顿了计算机各个方向的从入门、进阶、实战的视频课程和电子书,依照目录正当分类,总能找到你须要的学习材料,还在等什么?快去关注下载吧!!!

朝思暮想,必有回响,小伙伴们帮我点个赞吧,非常感谢。

我是职场亮哥,YY 高级软件工程师、四年工作教训,回绝咸鱼争当龙头的斜杠程序员。

听我说,提高多,程序人生一把梭

如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个激励,将不胜感激。

职场亮哥文章列表:更多文章

自己所有文章、答复都与版权保护平台有单干,著作权归职场亮哥所有,未经受权,转载必究!

退出移动版