哈希

作者: GHope | 来源:发表于2018-12-02 15:58 被阅读286次

    哈希算法

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

    哈希算法是一个单向运算的函数(单向哈希函数)
    通过哈希算法可以将对象计算出哈希摘要但是哈希摘要无法还原出原来的对象
    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)
    

    相关文章

      网友评论

        本文标题:哈希

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