摘要算法

是什么

  1. 给定任意长度数据生成定长的密文;

    • md5 输出32 hex字符
    • sha1 输出40 hex字符
    • sha256 输出64 hex字符
  2. 摘要结果不可逆,不能通过密文还原出原数据;

    • 破解1: 彩虹表, 提前生成的简单密码表摘要.
    • 破解2: 对密文进行碰撞; 构造一个输入,产生和密文一样的摘要,从而发现原文.
    • 解决: 加盐提高破解难度.

有什么用

  1. 通常用来做 数据完整性验证加密用户密码.
  2. 加密用户密码时, 存储在数据库的是密文; 由于不可逆, 所以密码不能找回, 只能重置.
  3. 加密用户密码时, 加盐提高破难度.

例子

1. 一次摘要

import hashlib

m = hashlib.md5(b'adi')
log(m.hexdigest()) # c46335eb267e2e1cde5b017acb4cd799

s = hashlib.sha1(b'adi')
log(s.hexdigest()) # b3e8ff7ac1c7e75661e16152a5dce1ff36a3e140

2. 加salt

def salted_password(password, salt):
    def md5hex(text):
        return hashlib.md5(text.encode('ascii')).hexdigest()
    hash1 = md5hex(password + salt)
    return hash1

3. 加salt 和 连续加密并用


def salted_password(password, salt):
    def md5hex(text):
        return hashlib.md5(text.encode('ascii')).hexdigest()
    def sha1hex(text):
        return hashlib.sha1(text.encode('ascii')).hexdigest()
    hash1 = md5hex(password)
    hash2 = sha1hex(hash1 + salt)
    return hash2
posted @ 2018-03-18 10:15  twlk28  阅读(135)  评论(0编辑  收藏  举报