How to reproduce an SHA256-based HMAC from R in Python 3

允我心安 提交于 2020-01-16 00:46:49

问题


I am trying to reproduce salted sha256 output from R code in Python:

library(openssl)
res = sha256("test@gmail.com", key = "111")  
res
# [1] "172f052058445afd9fe3afce05bfec573b5bb4c659bfd4cfc69a59d1597a0031"
import hashlib, binascii
dk = hashlib.pbkdf2_hmac(='sha256', b'test@gmail.com', b'111', 0)
binascii.hexlify(dk)
# b'494c86307ffb9e9e31c4ec8782af6498e91272c011a316c242d9164d765be257'

How can I make output in python match R?


回答1:


I can't quite reproduce your issue. The following keys match

In R:

library(openssl)
sha256("test@gmail.com")
#[1] "87924606b4131a8aceeeae8868531fbb9712aaa07a5d3a756b26ce0f5d6ca674"

In Python3:

import hashlib
print(hashlib.sha256(b"test@gmail.com").hexdigest())
#87924606b4131a8aceeeae8868531fbb9712aaa07a5d3a756b26ce0f5d6ca674

Update in response to your comment

The first thing to notice is that in R sha256 with a non-NULL key argument will calculate the hash-based message authentication code (HMAC). From ?sha256:

All hash functions either calculate a hash-digest for ‘key == NULL’ or HMAC (hashed message authentication code) when ‘key’ is not ‘NULL’.

So if you want to use a key you will need to compare the resulting HMAC in R with the SHA2556-based HMAC in Python.

In R:

library(openssl)
sha256("test@gmail.com", key = "111")
#[1] "172f052058445afd9fe3afce05bfec573b5bb4c659bfd4cfc69a59d1597a0031"

In Python 3:

import hmac
import hashlib
print(hmac.new(b"111", b"test@gmail.com", hashlib.sha256).hexdigest())
#172f052058445afd9fe3afce05bfec573b5bb4c659bfd4cfc69a59d1597a0031


来源:https://stackoverflow.com/questions/58384610/how-to-reproduce-an-sha256-based-hmac-from-r-in-python-3

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!