哈希

哈希算法

  • 哈希摘要 - 数字签名/数字指纹 - 防篡改/保护敏感信息

哈希算法是一个单向运算的函数(单向哈希函数)
通过哈希算法可以将对象计算出哈希摘要但是哈希摘要无法还原出原来的对象
Martin Fowler - 代码有很多种坏味道重复是最坏的一种
当代码已经充斥着各种坏味道的时候就需要对代码进行重构(refactor)

from hashlib import md5
from hashlib import sha1
from hashlib import sha256
from hashlib import sha512

class StreamHash():
    """哈希摘要生成器"""

    def __init__(self, algorithm='md5', size=1024):
        self.size = size
        alg = algorithm.lower()
        if alg == 'md5':
            self.hash = md5()
        elif alg == 'sha1':
            self.hash = sha1()
        elif alg == 'sha256':
            self.hash = sha256()
        elif alg == 'sha512':
            self.hash = sha512()
        else:
            raise ValueError('不支持指定的摘要算法')

    # 魔法方法: 让对象可以像函数一样被调用
    def __call__(self, stream):
        return self.to_digest(stream)

    def to_digest(self, stream):
        """生成十六进制形式的哈希摘要字符串"""
        for data in iter(lambda: stream.read(self.size), b''):
            self.hash.update(data)
        return self.hash.hexdigest()

def main():
    # hash = md5()
    sh = StreamHash()
    with open('魔术方法指南.pdf', 'rb') as stream:
        # for buf in iter(lambda: stream.read(4096), b''):
        #     hash.update(buf)
        # print(hash.hexdigest())
        print(sh(stream))
        print(sh.to_digest(stream))


if __name__ == '__main__':
    main()

加密和解密

  • 明文 ---加密---> 密文 ---解密---> 明文

对称加密 - 加密和解密使用同一个密钥 - DES / AES
非对称加密 - 加密和解密使用不同的密钥(公钥和私钥)- RSA
pip install pycrypto

编码和解码

  • 将内存中的二进制数据处理成其他的形式 - BASE64

BASE64 - 用64个字符(a-zA-Z0-9/+)表示所有的二进制数据
具体实现过程如下:

  110000   111010   011100   110101
00110000 00111010 00011100 00110101 
    with open('guido.jpg', 'rb') as rs:
        with open('guido.txt', 'w') as ws:
            buf = base64.b64encode(rs.read())
            ws.write(buf.decode())

    with open('guido.txt', 'r') as rs:
        with open('/Users/Hao/Desktop/gidaye.jpg', 'wb') as ws:
            buf = base64.b64decode(rs.read().encode())
            ws.write(buf)

你可能感兴趣的:(哈希)