VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python3标准库:hmac密码信息签名与验证(2)

)
  • pickled_data = pickle.dumps(o)
  • digest = make_digest(b'not the pickled data at all')
  • header = b'%s %d\n' % (digest, len(pickled_data))
  • print('\nWRITING: {}'.format(header))
  • out_s.write(header)
  • out_s.write(pickled_data)
  •  
  • out_s.flush()
  • 既然数据在BytesIO缓冲区中,那么可以将它再次读出。首先读取包含摘要和数据长度的数据行,然后使用得到的长度值读取其余的数据。pickle.load()可以直接从流读数据,不过这种策略有一个假设,认为它是一个可信的数据流,但这个数据还不能保证足够可信到可以解除pickled。可以将pickle作为一个串从流读取,而不是真正将对象解除pickled,这样会更为安全。

    
    	
    1. # Simulate a readable socket or pipe with a buffer
    2. in_s = io.BytesIO(out_s.getvalue())
    3.  
    4. # Read the data
    5. while True:
    6. first_line = in_s.readline()
    7. if not first_line:
    8. break
    9. incoming_digest, incoming_length = first_line.split(b' ')
    10. incoming_length = int(incoming_length.decode('utf-8'))
    11. print('\nREAD:', incoming_digest, incoming_length)

    一旦pickled数据在内存中,那么可以重新计算摘要值,并使用compare_digest()与所读取的数据进行比较。如果摘要匹配,就可以信任这个数据,并对其解除pickled。

    
    	
    1. incoming_pickled_data = in_s.read(incoming_length)
    2.  
    3. actual_digest = make_digest(incoming_pickled_data)
    4. print('ACTUAL:', actual_digest)
    5.  
    6. if hmac.compare_digest(actual_digest, incoming_digest):
    7. obj = pickle.loads(incoming_pickled_data)
    8. print('OK:', obj)
    9. else:
    10. print('WARNING: Data corruption')

    输出显示第一个对象通过验证,不出所料,认为第二个对象“已被破坏”。

    
    相关教程
    关于我们--广告服务--免责声明--本站帮助-友情链接--版权声明--联系我们       黑ICP备07002182号