数据完整性算法在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 最后
爱你