zoukankan      html  css  js  c++  java
  • 密码学之摘要算法

    本文示例代码详见:https://github.com/52fhy/crypt-demo

    摘要算法

    摘要算法又称哈希/散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。算法不可逆。

    散列/哈希算法有:

    SHA1  SHA224  SHA256  SHA384  SHA512  MD5
    HmacSHA1 HmacSHA224 HmacSHA256 HmacSHA384 HmacSHA512 HmacMD5 PBKDF2
    

    MD5

    MD5(Message-Digest Algorithm 5,消息摘要算法版本5)是最常见的摘要算法,它由MD2、MD3、MD4发展而来,速度很快。

    MD2、MD4、MD5 都产生16字节(128位)的校验值,一般用32位十六进制数表示。MD2的算法较慢但相对安全,MD4速度很快,但安全性下降,MD5比MD4更安全、速度更快。

    示例:

    • PHP
    <?php
    echo md5('123456'); //e10adc3949ba59abbe56e057f20f883e
    
    • CryptoJS
    CryptoJS.MD5('123456').toString();
    //"e10adc3949ba59abbe56e057f20f883e"
    
    • Python
    import hashlib
    
    md5 = hashlib.md5()
    md5.update('123456'.encode('utf-8'))
    print(md5.hexdigest())
    
    # e10adc3949ba59abbe56e057f20f883e
    

    通常,在使用md5保存用户口令时,需要经过Salt处理,这样只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令:

    <?php
    echo md5('123456' . 'Salt'); //7c7dd7e00f2bd6ba637009f35e05b3e8
    

    SHA1

    SHA(Secure Hash Algorithm)是由美国专门制定密码算法的标准机构—— 美国国家标准技术研究院(NIST)制定的。

    SHA系列算法的摘要长度分别为:SHA为20字节(160位,通常用一个40位的16进制字符串表示)、SHA256为32字节(256位)、 SHA384为48字节(384位)、SHA512为64字节(512位),由于它产生的数据摘要的长度更长,因此更难以发生碰撞,因此也更为安全,它是未来数据摘要算法的发展方向。由于SHA系列算法的数据摘要长度较长,因此其运算速度与MD5相比,也相对较慢。

    SHA1的应用较为广泛,主要应用于CA和数字证书中,另外在互联网中流行的BT软件中,也是使用SHA1来进行文件校验的。

    示例:

    • PHP
    <?php
    echo sha1('123456'); //7c4a8d09ca3762af61e59520943dc26494f8941b
    
    • CryptoJS
    CryptoJS.SHA1('123456').toString();
    //"7c4a8d09ca3762af61e59520943dc26494f8941b"
    
    CryptoJS.SHA256('123456').toString();
    //"8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92"
    
    • Python
    import hashlib
    
    # sha224, sha256, sha384, sha512同理
    sha1 = hashlib.sha1()
    sha1.update('123456'.encode('utf-8'))
    print(sha1.hexdigest())
    
    # 7c4a8d09ca3762af61e59520943dc26494f8941b
    

    HmacMD5

    HMAC算法的实现过程需要一个加密用的散列函数(表示为H)和一个密钥。

    一般我们采用的散列函数为Md5或者SHA1,这两个散列函数的分割数据块长度都是64字节,即512位。

    HmacMD5算法就是采用密钥加密 + Md5信息摘要的方式形成新的密文。使用该方法,需要提供一个加密密钥。加密的结果是160 bit字节(40位的16进制字符串)。

    示例:

    • CryptoJS
    CryptoJS.HmacMD5('123456','pwd').toString();
    //"a3aa6035b15bb6ea4041a939c315914a"
    
    CryptoJS.HmacSHA1('123456','pwd').toString();
    //"20a4e59d574dfde8c83d5185b35c92e2eda206f0"
    

    常用库介绍

    Crypto-JS

    https://github.com/brix/crypto-js

    CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法。目前已支持的算法包括:

    • MD5
    • SHA-1
    • SHA-256
    • AES
    • Rabbit
    • MARC4
    • HMAC
      • HMAC-MD5
      • HMAC-SHA1
      • HMAC-SHA256
    • PBKDF2

    hashlib

    Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

    在线工具

    1、在线加密解密
    http://tool.oschina.net/encrypt?type=2

  • 相关阅读:
    STM32的CRC32 软件实现代码
    AES CBC/CTR 加解密原理
    Either, neither, both
    Answer Sheet
    Both
    How to convert a byte to its binary string representation
    how convert large HEX string to binary array ?
    TEA -- Tiny Encryption Algorithm
    DES
    IAR EWARM Checksum Technical Note
  • 原文地址:https://www.cnblogs.com/52fhy/p/6857840.html
Copyright © 2011-2022 走看看