我正在尝试使用网站的OAuth,这要求签名方法仅为"HMAC-SHA1".
我想知道如何在Python中实现它?
我在Python2中有一个运行良好的脚本.
def _generate_signature(data):
return hmac.new('key', data, hashlib.sha256).hexdigest()
Run Code Online (Sandbox Code Playgroud)
数据是输出的地方json.dumps.
现在,如果我尝试在Python 3中运行相同类型的代码,我会得到以下内容:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.4/hmac.py", line 144, in new
return HMAC(key, msg, digestmod)
File "/usr/lib/python3.4/hmac.py", line 42, in __init__
raise TypeError("key: expected bytes or bytearray, but got %r" %type(key).__name__)
TypeError: key: expected bytes or bytearray, but got 'str'
Run Code Online (Sandbox Code Playgroud)
如果我尝试将密钥转换为字节,如下所示:
bytes('key')
Run Code Online (Sandbox Code Playgroud)
我明白了
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: string argument without an encoding
Run Code Online (Sandbox Code Playgroud)
我仍然在努力理解Python 3中的编码.
在使用S3样式身份验证的RESTful API中,API客户端使用HMAC-SHA1使用其密钥对请求进行签名,因此密钥永远不会通过线路传输.然后,服务器使用该客户端的密钥对客户端进行身份验证,以重复签名过程本身,并将结果与客户端发送的签名进行比较.
这一切都很好,但这意味着服务器需要访问客户端共享密钥的明文.面对所有的建议,反对在数据库中清除存储用户密码.就我所知,只存储密码的盐渍哈希不是一个选项 - 因为那时我无法验证客户端的签名.
我应该强调我的API是RESTful的,因此应该是无状态的:我宁愿在其他API调用之前避免登录步骤.
一种可选的解决方案是使用一些对称密钥算法加密所有用户密码.但是,服务器必须将密钥存储在易于访问的地方,例如在源代码内.这比没有好,但不是最佳解决方案(正如@Rook在他的回答中提到的,它违反了CWE-257).
解决方案的另一个方向可能是非对称签名,但我无法弄清楚如何将其应用于HMAC,并且找不到关于该主题的任何文章.
我错过了一些明显的东西吗?许多可敬的提供商已经实施了这种认证方案 - 它们不能都违反共同的安全原则,是吗?如果没有,您是否有可以分享的最佳实践?
最近,我的银行发给我这个小设备,它生成一个必须在执行在线交易时使用的唯一代码,当我按下一个特定的白色按钮时,所有设备都会生成这个唯一的代码,它看起来不像是连接到一个远程服务器或其他任何东西.
我做了一些研究,最后在密码学中使用了一种称为Hash函数的东西,但我仍然没有得到它.
我的问题
hash cryptography hmac one-time-password two-factor-authentication
我试图找到一个列表strings,可以使用一个加密算法来适应这个功能,取而代之SHA256.
crypto.createHmac("SHA256", secret).update(string).digest('base64'),
Run Code Online (Sandbox Code Playgroud)
我已经了解到crypto使用的理解openssl,并且算法特定于运行node.js的每个系统.
使用以下命令,您可以看到系统可用的所有算法的列表.
openssl list-cipher-algorithms
openssl list-cipher-commands
Run Code Online (Sandbox Code Playgroud)
我已经将这两个命令的内容输出到了这个要点.
困扰我的是,SHA256这些都不在其中.
我真的很喜欢最终的算法列表.
使用.NET和C#我需要使用HMAC SHA512为PHP服务器提供完整性字符串.在C#中使用:
Encoding encoding = Encoding.UTF8;
byte[] keyByte = encoding.GetBytes(key);
HMACSHA512 hmacsha512 = new HMACSHA512(keyByte);
byte[] messageBytes = encoding.GetBytes(message);
byte[] hashmessage = hmacsha512.ComputeHash(messageBytes);
return(ByteToString(hashmessage).toUpper());
Run Code Online (Sandbox Code Playgroud)
但它与PHP hash_hmac()PHP代码不匹配:
$hmac = strtoupper(hash_hmac($pbx_hash, $msg, $binKey));
Run Code Online (Sandbox Code Playgroud)
我尝试用C#(utf8,ASCII,Unicode)改变编码而没有成功.
我已尝试在网上找到很多解决方案,但没有给出相同的字符串:(
我无法更改PHP代码,也看不出C#中的错误
编辑这是ByteToString(从评论中复制):
static string ByteToString(byte[] buff)
{
string sbinary = "";
for (int i = 0; i < buff.Length; i++)
{
sbinary += buff[i].ToString("X2"); /* hex format */
}
return (sbinary);
}
Run Code Online (Sandbox Code Playgroud)
经过多次发布后,我发现如果PHP hash_hmac键是一个字符串,而不是一个字节数组,我会得到相同的结果.似乎问题出在PHP转换函数$ binKey = pack("H*",$ keyTest);
如果通过https发送所有api呼叫,HMAC是否会添加任何额外的安全性?例如,在oauth 2中,客户端将其密钥发送给提供者而不进行任何散列.这被认为是安全的,因为它超过https?虽然不是严格的oauth,在这次通话中使用HMAC会使oauth 2更安全吗?如果是这样,为什么不是oauth 2的标准部分呢?
所以我想弄清楚如何在ios上做一个hmacshad256哈希,因为这是我为我所做的wcf服务api做的哈希.我一直在尝试寻找有关它的一些信息,但通常最终会得到一个SHA-256哈希.
这是我唯一的参考:
需要像Java一样在Objective C中生成HMAC SHA256哈希
而且我不确定这是否是唯一的方法(导入java hmac类)
任何帮助表示赞赏.
谢谢!
hmac ×10
cryptography ×4
python ×2
algorithm ×1
c# ×1
encoding ×1
encryption ×1
hash ×1
https ×1
ios ×1
javascript ×1
node.js ×1
oauth ×1
oauth-2.0 ×1
objective-c ×1
pbkdf2 ×1
php ×1
python-3.x ×1
security ×1
sha1 ×1
sha2 ×1
sha256 ×1
sha512 ×1
string ×1