白话hash和数字签名,保证你看得懂
链客,专为开发者而生,有问必答!
此文章来自链客区块链技术问答社区,未经允许拒绝转载。
摘要:最近有朋友在后台问为啥最近老介绍hash相关文章,其实hash算法在信息安全中非常重要,尤其是作为数字签名中非常重要的一环,今天就来详细把这个事情讲清楚 白话hash 可能以前的文章讲得不够简单,hash算法其实就是将一段非常长的数据通过hash变换为一个固定长度相对较短的数据,简称“摘要”,你可以理解成把一本书通过hash变成一段很短的话,算法最关键的要点是,哪怕你改动了这本书里面的一个标点符号,hash后的摘要都会改变。
最近有朋友在后台问为啥最近老介绍hash相关文章,其实hash算法在信息安全中非常重要,尤其是作为数字签名中非常重要的一环,今天就来详细把这个事情讲清楚
可能以前的文章讲得不够简单,hash算法其实就是将一段非常长的数据通过hash变换为一个固定长度相对较短的数据,简称“摘要”,你可以理解成把一本书通过hash变成一段很短的话,算法最关键的要点是,哪怕你改动了这本书里面的一个标点符号,hash后的摘要都会改变。(累死我了,我发现说大白话讲技术问题挺难的)
以MD5这种hash算法为例,他可以将任意长度的数据变成128位的散列值,所谓任意长度的意思就是你的数据可以是一篇文章,一部电影,或者只是一个字母,哪怕是个空字符串,下面这个就是MD5一个空字符串后的值:
MD5("")= d41d8cd98f00b204e9800998ecf8427e
这个例子只是说明hash可以将任意长度的数据变为一个固定长度的值,算法的精妙在于这个值对于不同的数据还是不一样的,如果不同的数据生成的hash值一样,就是有名的“hash碰撞了”
其实hash适合于比较大的数据做摘要,不能作为加密使用,很多误传为MD5加密,也有人称之为单向加密,就是指不能通过hash后的值不能推导原来的数据,这种说法不够严密,比如很多网站喜欢将用户的密码经过MD5变换后存储,主要防止数据库泄露后直接查看用户的密码,真正密码比对时对用户输入的密码进行md5变换然后和存储的md5值比较
从密码学上讲加密过程都要对应解密过程,即可以通过密文还原明文,所以以上的密码保护方法不是严格意义上的数据加密解密。
对于以上方法,一般采用md5字典进行暴力解密,只需要对原有的密码字典进行MD5变换,然后进行字典比对,不会增加太多的计算复杂度,比如你看到d41d8cd98f00b204e9800998ecf8427e这个值就知道代表的是一个空字符串。
不对称加密
所谓不对称加密,是对于对称加密而言的,传统的对称加密只有一个秘钥(你可以理解为密码),你用这个秘钥加密,别人也用这个秘钥解密,这里面有个弊端就是,你把解密的密码告诉别人时,比如发短信、发微信,这时候回受到中间人攻击,简单举例说就是运营商等会看到你发的密码,然后你们之间的通讯数据就被解开。
后来英国人搞出来不对称加密,它包含两个成对的密钥,这里面有个概念一定要搞清楚,这个两个成对的秘钥是同时生成的,数学上存在一定关系,并没有严格意义上的哪一个必须是公钥,哪一个必须是私钥,你公布出去的那个就是公钥,你保留的那个就是私钥,看你高兴。
需要注意的时,不同的算法在设计时,为了保障效率公钥会采用固定值生成,比如RSA算法建议公钥的运算e1取值为3或65537(从理论上说迭代猜中的几率更大),所以在实际应用中最好按照推荐选择保留自己的私钥
另外一个概念来了,这是很多人对于后期数字签名比较容易搞蒙圈的地方,首先我们要知道对于不对称加密一个重要特点就是:公钥加密的数据私钥可以解密,私钥加密的数据公钥可以解密,记住这句话后面的数字签名原理你就能搞清楚。
数字签名
前面讲了不对称加密,现在你有了一个可以公布出去的公钥的,公钥的作用就是公布出去,如果对方想给你发信息,他就可以可以用你的公钥进行数据加密然后发给你,你用你的私钥解密数据,即便是中间人截获你的公钥也没用。如果你想给对方发加密信息,那么就反过来需要知道对方的公钥即可。所以不对称加密最重要的就是保护你的私钥,这就是我们常说的使用不对称算法进行加密数据传输。
那么数字签名又是什么呢,其实也很简单了,大白话来讲也是一个加密解密过程,就是将数据用你的私钥进行加密,然后把明文和密文都发给对方,对方用你的公钥对密文进行解密,然后比对解密后的明文是不是一样,这样就证明这个数据没有被第三方篡改,的确是你书写的
现在hash算法的重要性要出来了,如果你发送的数据非常短,比如“我爱你”“我恨你”这些很短的句子,你是用不到hash算法的,你只需要用你私钥加密这些短句,然后把 “我爱你”连同加密后的数据比如"@#@#%",一起发过去,对方用你的公钥解开一看果然是“我爱你”,证明没有被篡改,如果解开一看是“我恨你”,就说明在传输过程被中间人篡改了。
如果你发的是一大段文字,比如万字情书什么的,你也可以使用刚才的方法进行签名,那么你就要发送很长一段的密文和明文给对方验证,这明显是浪费资源的。
第一节说过,你终于可以使用hash算法,hash算法就是可以把很长的数据摘要成很短的一段数据,比如采用MD5后只有128位,现在你就可以使用MD5摘要你的万字情书了,得到一个128位的摘要,然后你使用你的私钥对这个128摘要进行加密,这个过程就叫做数字签名,所以数字签名是两个过程,先对数据进行hash摘要,然后对摘要进行私钥加密。
然后你只需要把你的情书和私钥加密后的摘要发给对方就行了,这明显减少了传输量,也让签名变得专业了(呵呵)。对方收到你的情书和加密摘要后,只需要对情书同样进行一次hash运算,得到一个128位数据,然后用你的公钥解密你发过来的摘要,如果这两个数据一样就证明这篇情书里面一个标点符号都没有改变,如果不一样,就证明数据在传输过程中被人篡改过,不是你所写,这个过程就叫做验证签名。
现在你明白hash算法的重要性了吧,简而言之,如果hash算法被攻破,中间人可以篡改你的数据,并保证篡改过的数据有一样的hash值,那么数字签名的基石就被动摇了
注:还有一种数字信封技术,可以让传递明文和签名更加安全,其实原理都差不多,明白加密原理后,你自己都能想出来这些所谓的数字信封、数字信笺、数字包裹一类的看似高大上的名词
相关文章:

几种Windows进程通信
32位Windows采用虚拟内存技术使每个进程虚拟4G内存,在逻辑上实现了对进程之间数据代码的分离与保护。那么相应的进程之间的通信也就有必要整理掌握一下。 Windows进程间通讯的方法有很多:管道、邮件槽、剪切板、共享内存、消息、套接字、RPC、DDE等。 但…

TestNG学习随笔
转载自:http://blog.sina.com.cn/s/blog_68f262210102vh5c.html 通过本人实践,文中所讲的程序可以正确运行,作用正确,并且浅显易懂。以下就是我从中摘录的重要知识点,就当留作自己记录或者帮助其他想学TestNG的人一点借…

录制短视频的录制按钮边框计时效果
项目增加录制短视频功能, 需一录制功能按钮, 使用贝塞尔曲线结合shapelayer绘制按钮边框的计时功能 代码如下: #import "YGRecordView.h" #define BeforeRecord_LineWidth 2.0#define BeforeRecord_LineColor UIColorFromRGBA(0xffffff, 1)#define Record_LineWidt…

区块链学堂:区块链引子
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链学堂(1):区块链引子 相信正在看这篇文章的读者一定已经听说过区块链了,并且也相信…

Git命令文本手册
git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 git config --global user.email "xxxxxx.com" …

Mininet的介绍安装
Mininet的介绍 Mininet是一个强大的网络仿真平台,通过这个这个平台,我们可以很方便的模拟真实环境中的网络操作与架构。当前SDN/OpenFlow发展的如火如荼,但是在真实网络中又不可以进行相关的网络实验,自然需要一个仿真平台可以对这…
项目的简单总结一 -- 关于对贝塞尔和shapelayer结合使用的动画特效
现项目基本稳定, 要开始新的项目, 总结一二 关于对贝塞尔和shapelayer结合使用的动画特效, 在这次的项目中有几处使用到 故做了个小的demo, 记录下 效果如下: demo地址:https://github.com/wyon0313/BezierAnimation

内部区块链的优缺点
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 内部区块链的优缺点1 区块链的作用是取代可信赖的第三方,或者是在不完全相互信任的实体之间建立信任关系,如此看来…

Spring框架系列之AOP思想
微信公众号:compassblog 欢迎关注、转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1、AOP概述 (1)、什么是 AOP AOP 为 Aspect Oriented Programming 的缩写,意为…

jstack 使用(转)
dump 文件里,值得关注的线程状态有:死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condition(重点关注) 等待获取监视器,Waiting on monit…

ios TableView编辑状态多选框的修改
在- (void)layoutSubview 和 - (void)setEditing:(BOOL)editing animated:(BOOL)animated 中添加 UIImage *selectImg [UIImage imageNamed:"im_select_sign"]; UIImage *disSelectImg [UIImage imageNamed:"im_disSelect_sign"]; for (UIC…

区块链有哪些技术特征
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链有哪些技术特征 在信息网络化的大背景下,当需要与不熟悉的对手方进行价值交换活动时,人们如何做才能防止不会…

《JavaEE开发的颠覆者——Spring Boot实战》是一本好书
这本书的风格非常好、每一节都是先点明这一块知识的要点,随后就手把手的做出一个最简明、但有能体现核心的实例(大多只有几个Class) 这样的书用来熟悉一门框架,实在是再好不过。转载于:https://www.cnblogs.com/nanlan2017/p/1045…

html css 布局知识概况
1、如果想设置页面居中,当设置margin属性为auto的时候,不能在设置浮动或绝对定位属性。并且一定要设置width为一个定值 2、盒子模型三维立体结构图 3、浮动布局 利用浮动可以实现横向布局,通过float来实现(left--左浮动࿰…
项目的简单总结二--可拉伸的头视图
项目总结二 tableVIew和collectionview中头视图的可拉伸放大效果 demo中只做了tableview的效果, collectionview做法一样 效果如下图: demo地址: https://github.com/wyon0313/ZoomHeaderView

浅谈区块链技术
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 浅谈区块链技术 这几天空闲的时候在网上浏览了一些区块链的技术,其实区块链只是一个技术,只不过是比特币很好的实…

IIS 7.5 去掉index.php 西数服务器
//新建web.config 加上下面代码<?xml version"1.0"?> <configuration> <system.webServer><rewrite><rules><rule name"OrgPage" stopProcessing"true"><match url"^(.*)$" /><condit…

bzoj1927: [Sdoi2010]星际竞速
跟上一题几乎一样。。。 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; #define rep(i,n) for(int i1;i<n;i) #define clr(x,c) memset(x,c,sizeof(x)) #define op() cl…

在cell中取得UITableView所在的ViewController对象
原来碰到这个问题一般会将控制器传进cell中, 或者将cell要做的响应事件回调到控制器去处理, 前段时间找到一种方法觉得很不错 - (UIViewController *)getTableViewSuperViewController { for (UIView* next [self superview]; next; next next.superview) { UI…

区块链当前现状
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链是分布式账本技术,用于记录交易数据,具有不可篡改性、完整分布性、可追溯性等技术优势,应用包括…

MVC 4.0 Razor模板引擎 @Html.RenderPartial 与 @Html.RenderAction 区别
近来在学习MVC 4.0,设置布局全局网页的页脚,使用了Razor语法 {Html.RenderPartial("Footer", Model.FooterData);} 但是并不理解Html帮助器方法Html.RenderPartial。 先来介绍一下Html.RenderPartial用法。 Html.RenderPartial在Asp.net Mvc中…

iOS 图片处理-利用GPUImage 磨皮和美白图片
项目中要求处理图片, 简单记录一下美白和磨皮过程 (其中GPUImage还有美颜滤镜, 使用方式基本一样) //磨皮 - (void)editPhotoByBilateralWithLevel:(CGFloat)level { GPUImagePicture *pic [[GPUImagePicture alloc] initWithImage:image]; // 磨皮滤镜…

linux下编译php扩展
1 在pecl.php.net搜索你需要的php扩展 2 在解压后的扩展目录运行phpize 3 执行编译./configure --with-php-config/usr/local/php/bin/php-config 4 修改php/lib/php.ini文件 加上这句话extention扩展.so的绝对路径转载于:https://www.cnblogs.com/wyqn/p/8493456.html

区块链技术原理
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 以比特币的区块链为例,你可以把区块链想象成一个比特币的公共账本,这个账本: 1.存放在互联网的各个比…

Spring之事务管理配置
1. 基于注解的事务配置 1. 在需要添加事务的方法上加上Transactional注解2. Spring的配置文件中配置事务管理器1 <!-- 添加事务管理器组件DataSourceTransactionManager -->2 <bean id"transactionManager"3 class"org.springframewor…

iOS 图片处理-图片旋转和裁剪
项目中要求处理图片, 简单记录一下图片旋转和裁剪过程 /** 将图片旋转弧度radians */- (UIImage *)imageRotatedByRadians:(CGFloat)radians{ // calculate the size of the rotated views containing box for our drawing space UIView *rotatedViewBox [[UIView alloc…

ThinkPHP 3.1.2 视图 1
一、模板的使用 (重点)a、规则模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html(.tpl)更换模板文件的后缀名(修改配置文件)TMPL_TEMP…

mysql事务处理用法与实例详解
MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关1.MyISAM:不支持事务,用于只读程序提高性能 2.InnoDB:支持ACID事务、行级锁、并发 3.Berkeley DB:支持事务一个事务是一个连续的一组数据库操作ÿ…

C++ 类的内存分布
C类内存分布 转自:http://www.cnblogs.com/jerry19880126/p/3616999.html先写下总结,通过总结下面的例子,你就会明白总结了。下面总结一下: 1、虚基类指针和虚函数指针是可以继承的 2. 虚函数指针来源于父类或者自己是第一个声明虚…

iOS 关于手机权限的检查与获取
手机通讯录权限: /** * 检测权限并作响应的操作 */ - (void)checkAuthorizationStatus:(UISwitch *)sender { switch (ABAddressBookGetAuthorizationStatus()) { case kABAuthorizationStatusAuthorized: //存在权限 //获取通讯…