美文网首页
密码学:HASH & 数字签名

密码学:HASH & 数字签名

作者: HotPotCat | 来源:发表于2021-04-16 14:42 被阅读0次

    一、HASH概述

    Hash一般翻译做“散列”,也直接音译为“哈希”,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要(指纹)的函数。

    • MD5
    • SHA1、256、512

    HASH特点

    • 算法是公开的
    • 对相同数据运算得到的结果是一样的
    • 对不同数据运算,如MD5得到的结果默认是128位,32个字符(16进制标识)。
    • 无法逆运算。(无法做加密)
    • 信息摘要,信息 指纹,用来做数据识别。

    为什么无法逆运算?
    比如对数据进行MD5运算得到的结果是128位,也就是能表达的数据是1632种(有限),那么由于数据(无限)。这里必然有多个数据拥有同样的hash值(散列碰撞)。

    二、HASH用途

    • 用户密码的加密 密码加密
    • 搜索引擎
      比如: iOS SwiftSwift iOS 搜索出来的结果可能相同。这里词有hash值,将多个词的hash值拿到加到一起。
    • 版权
      任意文件都会生成一个hash值。上传平台后平台会保存原始文件hash值。别人下载的文件不是原文件(平台生成)。这个时候平台就可以通过原文件hash来区分确定版权问题了。
    • 网盘
      数据识别-hash
    • 数字签名

    三、数字签名

    因为国外喜欢用支票,支票上面的签名能够证明身份。数字签名顾名思义,就是用于鉴别数字信息的方法。确认二进制是不是原始机构签发的。

    image.png
    1.对二进制计算hash值。
    2.签发方对hash值进行rsa加密。
    3.接收方解密获取hash值并且对二进制文件计算hash值,hash值相同则证明是原始文件。

    在这里对hash值进行rsa加密后的数据就叫做这个二进制文件的数字签名

    四、hash终端

    HASH

    md5

    // 字符串
    md5 -s "HotpotCat"
    //文件
    md5 message.txt
    

    计算MD5散列结果,返回32个字符的MD5散列字符串:

    a3c28fbab2813ebc16d8b89af683e696
    
    b15dee09737df6c4a23079148ff64172
    

    sha1

    //字符串
    echo -n "HotpotCat" | openssl  sha1
    //文件
    openssl sha1 message.txt
    

    计算SHA1散列结果,返回40个字符的SHA1散列字符串:

    108e0108a568820fe1fa71038091a0f4d753f5b2
    
    ccc9cd754ec0708ae43b83813adb4b10895d67a1
    

    sha256

    //字符串
    echo -n "HotpotCat" | openssl sha256
    //文件
    openssl sha256 message.txt
    

    计算SHA256散列结果,返回64个字符的SHA256散列字符串:

    cc49e970f712386a382c990bd5670298eb1bf5167e85b3d95b9c394394eda7ce
    
    fbabb42485e50ebb8bbaf200841cfebd21bfbe7e44e28a8068dff888b6952a3a
    

    sha512

    //字符串
    echo -n "HotpotCat" | openssl sha512
    //文件
    openssl sha512 message.txt
    

    计算SHA 512散列结果,返回128个字符的SHA 512散列字符串:

    7672238bfe9cd9ccc37bfab26052fb96cf9e43df8b21fc906ea9fcb79e26d0aed059cee305295e874a674e5f1dc15a1f2e76101c11a98ae48a6ace5ad6de0f8e
    
    587d4c39b3e1005a6a950eabe974ae519a0589197fe186a9a656898dc32ea957d52c306ddface8f917b5e773f0e14bc7f487a3c2a0ff5e536ae407d02fe0ce4c
    

    HMAC

    HMAC md5

    echo -n "HotpotCat" | openssl dgst -md5 -hmac "key"
    

    计算HMAC MD5散列结果,返回32个字符的HMAC MD5散列字符串:

    9374e4e9c7bbe8e18cef29fafd76f9e6
    

    HMAC SHA1

    echo -n "HotpotCat" | openssl sha1 -hmac "key"
    

    计算HMAC SHA1散列结果,返回40个字符的HMAC SHA1散列字符串:

    c6e00dfd90223967caa9c706e356a493c02f33b8
    

    HMAC SHA256

    echo -n "HotpotCat" | openssl sha256 -hmac "key"
    

    计算HMAC SHA256散列结果,返回64个字符的HMAC SHA256散列字符串:

    16c67f0640105490197c5c7f5ca9a9412e494eaebc541e47c1cf1e01499350c8
    

    HMAC SHA512

    echo -n "HotpotCat" | openssl sha512 -hmac "key"
    

    计算HMAC SHA512散列结果,返回128个字符的HMAC SHA512散列字符串:

    246a301b3324cded0d44bbb1f036dc2c5580fbefc6d6ddf05ac06a262604bc738b5200ed42efa05c941bc2cd29b122b00ebe28065fdd9d95c7122579bd9b8dfb
    

    五、hash代码

    iOS中加密解密框架是CommonCrypto

    //string
    NSString *message = @"HotpotCat";
    NSString *key = @"key";
    NSLog(@"string md5: %@",[message md5String]);
    NSLog(@"string sha1: %@",[message sha1String]);
    NSLog(@"string sha256: %@",[message sha256String]);
    NSLog(@"string sha512: %@",[message sha512String]);
    NSLog(@"string hmac md5: %@",[message hmacMD5StringWithKey:key]);
    NSLog(@"string hmac sha1: %@",[message hmacSHA1StringWithKey:key]);
    NSLog(@"string hmac sha256: %@",[message hmacSHA256StringWithKey:key]);
    NSLog(@"string hmac sha512: %@",[message hmacSHA512StringWithKey:key]);
    
    //文件
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"message" ofType:@"txt"];
    NSLog(@"file md5: %@",[filePath fileMD5Hash]);
    NSLog(@"file sha1: %@",[filePath fileSHA1Hash]);
    NSLog(@"file sha256: %@",[filePath fileSHA256Hash]);
    NSLog(@"file sha512: %@",[filePath fileSHA512Hash]);
    

    输出:

    string md5: a3c28fbab2813ebc16d8b89af683e696
    string sha1: 108e0108a568820fe1fa71038091a0f4d753f5b2
    string sha256: cc49e970f712386a382c990bd5670298eb1bf5167e85b3d95b9c394394eda7ce
    string sha512: 7672238bfe9cd9ccc37bfab26052fb96cf9e43df8b21fc906ea9fcb79e26d0aed059cee305295e874a674e5f1dc15a1f2e76101c11a98ae48a6ace5ad6de0f8e
    string hmac md5: 9374e4e9c7bbe8e18cef29fafd76f9e6
    string hmac sha1: c6e00dfd90223967caa9c706e356a493c02f33b8
    string hmac sha256: 16c67f0640105490197c5c7f5ca9a9412e494eaebc541e47c1cf1e01499350c8
    string hmac sha512: 246a301b3324cded0d44bbb1f036dc2c5580fbefc6d6ddf05ac06a262604bc738b5200ed42efa05c941bc2cd29b122b00ebe28065fdd9d95c7122579bd9b8dfb
    file md5: b15dee09737df6c4a23079148ff64172
    file sha1: ccc9cd754ec0708ae43b83813adb4b10895d67a1
    file sha256: fbabb42485e50ebb8bbaf200841cfebd21bfbe7e44e28a8068dff888b6952a3a
    file sha512: 587d4c39b3e1005a6a950eabe974ae519a0589197fe186a9a656898dc32ea957d52c306ddface8f917b5e773f0e14bc7f487a3c2a0ff5e536ae407d02fe0ce4c
    

    Demo

    总结

    • HASH
      • 特点:
        算法公开
        不可逆运算(多对一)
        相同数据加密结果相同
        不同数据加密结果定长
        一般用于数据的识别(密码,版权,网盘)
      • HASH用途:
        • 密码加密
          MD5直接加密,可以被反查询
          加盐(固定盐有安全隐患)
          HMAC加密方案:通过动态key加密数据
          HMAC+时间戳: 加入时间变量保证每次加密结果受时间影响
      • 数字签名
        算法:HASH+RSA
        目的:验证数据的完整性不被篡改
        逻辑:
        1.原始数据进行Hash
        2.使用RSA机密HASH值(这部分数据就是原始数据的数字签名)
        3.将原始数据+数字签名一起发送传递(客户端使用公钥解密验证)

    相关文章

      网友评论

          本文标题:密码学:HASH & 数字签名

          本文链接:https://www.haomeiwen.com/subject/exhjlltx.html