zoukankan      html  css  js  c++  java
  • 哈希算法与加密通信、数字签名

    作为通信工程的学生,我在学习《信息论与编码》这门课的时候了解过关于加密解密的一些知识,但觉得不够深入,不甚过瘾。

    这几天学习了跟密码学有很大关联的哈希算法,跟大家分享一下。

    哈希算法是什么

        哈希,英文为Hash,有时翻译为散列,所以哈希函数又叫做散列函数。度娘的解释是“

    把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

    哈希函数的运算结果就是哈希值,通常简称为哈希。

    哈希算法的特点

    哈希算法应该具备三个基本点:

        1.独一无二,两个不同的数据,要有不相同的哈希

        2.安全,给定数据M容易算出哈希值X,给定X不可算出M(单向算法)

        3.长度固定,给定一种哈希算法,不管输入多大数据,输出长度固定

        *当然,安全性只是相对而言,因为输入取值范围无限而哈希长度固定的话,如果输入足够庞大,肯定会找到两个一样的哈希值

    假如出现了两个不同输入有相同输出的情况,称为碰撞(collision)。不同的哈希算法,位数越多,则安全级别越高,或者说抗碰撞性越好。

    哈希算法的作用

        哈希的独一无二保证了:如果数据在存储或传输过程中有丝毫损坏,那它的哈希就会改变。哈希函数最常见的一个作用就是进行完整性校验(Integrity Check),完成即数据无损坏。哈希函数的基本作用是给大数据算出一个摘要性的长度固定的字符,即哈希。

        哈希也可以叫做Checksum(校验值)、Digest(摘要)、Fingerprint(指纹),大抵是一个意思:哈希可以代表数据本身。

    哈希算法的分类与区别

        总体上分为两类:普通哈希;加密哈希(cryptographic hash function)

        加密哈希跟普通哈希的区别就是安全性,一般原则是只要一种哈希算法出现过碰撞,就会不被推荐成为加密哈希了,只有安全度高的哈希算法才能用作加密哈希。

    同时加密哈希其实也能当普通哈希来用,Git版本控制工具就是用SHA-1这个加密哈希算法来做完整性校验的。一般来讲越安全的哈希算法,处理速度也就越慢,所以并不是所有的场合都适合用加密哈希来替代普通哈希。

    在密码学领域,有两个算法都是把数据做输入,而输出是一段谁也看不懂的数据。其中一个就是哈希算法,另外一个是加密算法。注意,哈希算法和加密算法是完全不同的。  

    • 哈希算法的输出长度是固定的,而加密算法的输出长度是跟数据本身长度直接相关的。

    • 哈希是不可以逆向运算出数据的,而加密算法的输出是要能够逆向运算出数据的。

    • 这里主要是强调加密哈希算法只是被用在加密过程中,但是它本身不是加密算法。

     

    哈希算法的应用

        哈希算法有很多种,长度越长的算法基本认为越安全。安全度低的哈希算法被认为是普通哈希算法,主要用来做完整性校验。安全度高的被称为加密哈希算法,会被用在加密算法中。
        实际中常见的哈希算法有MD5、SHA-1和SHA-256等等,其中MD5通常用来进行数据校验,SHA-1曾经是加密哈希算法,但是目前已经被除名,也只能做为一种安全度更高的校验算法了。SHA-256依然是广泛使用的加密哈希算法,在比特币生成地址以及POW工作量证明算法中都会用到。

        主要应用大场景有两个:

        1、网站注册

            当我们提交用户名密码的时候,用户名被会直接保存到网站的数据库中,但是密码却不是直接保存的,而是先把密码转换成哈希,保存到数据库中的其实是哈希。所以,即使是公司后台管理人员,也拿不到用户的密码。这样,如果万一公司数据库泄露了,用户的密码依然是安全的。而当用户自己登录网站的时候,输入密码提交到服务器,服务器上进行相同的哈希运算,因为输入数据没变,所以哈希也不会变,登录也就成功了
     

        2、区块链和加密货币        

            比特币地址生成的时候,就用到了 SHA-256 算法,POW 也就是工作量证明,用的也是这个算法。

     

    所以,基本上凡是涉及到密码学的地方,都会或多或少的用到哈希函数。
     

    哈希的基本作用就是提供一个数据的摘要或者指纹,通常的使用场景就是完整性校验。哈希算法有很多种,一般来讲哈希越长的算法,安全性也就越高,安全度足够高的哈希,或者说没有任何人能够成功实现碰撞的哈希,才有资格被考虑用在加密场合,而这类的哈希算法也被叫做加密哈希算法。

      

    总而言之,哈希是密码学的基础,理解哈希是理解数字签名和加密通信等技术的必要前提。

        

  • 相关阅读:
    iOS开发-图片高斯模糊效果
    很认真地聊一聊程序员的自我修养
    iOS 动画队列—仿映客刷礼物效果
    iOS -NSOperation并发编程
    iOS Status Bar变换
    iOS 使用Quartz和OpenGL绘图
    iOS开发中WiFi相关功能总结
    视频直播初窥:高仿喵播APP
    智捷公开课马上开始了-欢迎大家一起讨论学习-第一系列读《Swift开发指南(修订版) 》看Swift视频教程
    《iOS开发指南》要改iOS8版本了,听听您的意见?
  • 原文地址:https://www.cnblogs.com/leedhwa/p/10249377.html
Copyright © 2011-2022 走看看