.net电商网站开发设计微信公众平台官方网站登录
数据完整性算法在shell及python中的实践
文章目录
- 数据完整性算法在shell及python中的实践
 - 1 预备知识
 - 1.1 摘要算法
 - 1.2 报文(数据)完整性校验
 - 1.3 python byte类型字符串与普通字符串区别
 
- 2 传统方法(散列函数)
 - 2.1 在shell中实践
 - 2.2 在python中实践的两种方法(hashlib)
 - a. 两步法
 - b. 一步法
 
- 3 主流方法(消息认证码)
 - 3.1 在shell中实践
 - 3.2 在python中实践
 
- 4 最后
 
1 预备知识
1.1 摘要算法
md5
sha1
sha256
sha512
sha1024
1.2 报文(数据)完整性校验
在Internet上,为了确保接收方所接收到的报文数据的完整性,人们采用消息认证来实现,主要方式有以下3种方式:消息认证码、散列函数和消息加密。
-  
消息认证码(MAC):它是一个需要密钥的算法,可以对可变长度的消息进行认证,把输出的结果作为认证符。
 -  
散列(HASH):它是将任意长度的消息映射成为定长的散列值,以该散列值作为认证符。(Hash一般翻译做散列、杂凑,或音译为哈希)
 -  
消息加密(encryption):它将整个消息的密文作为认证符。
 
消息认证码:
- MAC(Message Authentication Code):消息认证码
 - HMAC(Hash-based Message Authentication Code):基于哈希消息认证码。 基于Hash函数和密钥进行消息认证的方法,现在已经成为事实上的Internet安全标准
 
1.3 python byte类型字符串与普通字符串区别
>>> x = 'abcdef'
>>> bx = b'abcdef'
>>> .
>>> print(x)
>>> abcdef
>>>
>>> print(bx)
>>> b'abcdef'
>>> .
>>> print(x.encode('utf-8'))
>>> b'abcdef'
 
2 传统方法(散列函数)
以下实践全部使用 md5 算法进行
2.1 在shell中实践
^_^ kevin@TM1701-b38cbc23:~$ key='secret'
^_^ kevin@TM1701-b38cbc23:~$ data='abcdef'
^_^ kevin@TM1701-b38cbc23:~$ echo -n ${key}${data} |  md5sum
2ab627f179598ff1a2dab029cd1e38c5  -
 
2.2 在python中实践的两种方法(hashlib)
两种方法结果一样
a. 两步法
>>> key = b'secret'
>>> data = b'abcdef'
>>> md5x = hashlib.md5()
>>>
>>> md5x.update(key)
>>> print(md5x.hexdigest())
5ebe2294ecd0e0f08eab7690d2a6ee69
>>>
>>> md5x.update(data)
>>> print(md5x.hexdigest())
2ab627f179598ff1a2dab029cd1e38c5        #--- 看1
 
b. 一步法
>>> key_data = b'secretabcdef'
>>> md5ab = hashlib.md5()
>>>
>>> md5ab.update(key_data)
>>> print(md5ab.hexdigest())
2ab627f179598ff1a2dab029cd1e38c5        #--- 看1
 
3 主流方法(消息认证码)
3.1 在shell中实践
^_^ kevin@TM1701-b38cbc23:~$ key='secret'
^_^ kevin@TM1701-b38cbc23:~$ data='abcdef'
^_^ kevin@TM1701-b38cbc23:~$
O_O kevin@TM1701-b38cbc23:~$ echo -n ${data} | openssl dgst -hmac ${key} -md5 -hex
(stdin)= ed838766eed9b76a06dcb11fe3b87937        #--- 看2
^_^ kevin@TM1701-b38cbc23:~$ echo -n ${data} | openssl dgst -hmac ${key} -md5 -binary | base64
7YOHZu7Zt2oG3LEf47h5Nw==
 
3.2 在python中实践
>>> key = b'secret'
>>> data = b'abcdef'
>>>
>>> hmac_a_b = hmac.new(key, data, digestmod='md5')
>>>.
>>> hmac_a_b.hexdigest()
'ed838766eed9b76a06dcb11fe3b87937'
>>> print(hmac_a_b.hexdigest())
ed838766eed9b76a06dcb11fe3b87937        #--- 看2
 
4 最后
爱你

