Jos*_*osh 8 url verification signing hmac private-key
我对网址签名很感兴趣(例如http://.../?somearg = value&anotherarg = anothervalue&sig = aSKS9F3KL5xc),但是我有一些要求让我没有解决方案.
PHP或Python用于页面,因此我需要能够使用其中一个来签名和验证签名.somearg=value&anotherarg=anothervalue)我的第一直觉是使用OpenSSL,例如使用RSA密钥对,按照以下方式执行某些操作:openssl rsautl -sign -inkey private.pem -in sensitive -out privsigned 并且privsigned仅根据数据和密钥进行验证:openssl rsautl -verify -inkey public.pem -in privsigned -pubin.
使用PHP的openssl_get_privatekey()和openssl_sign()体征的数据不错,但我需要知道,以便核实(我不会有)的(解密!)数据:openssl_get_publickey()与openssl_verify($data, $signature, $pubkeyid);来自http://php.net/openssl_verify.
或者我在这里遗漏了什么?
所以,我看着HMAC,但尽管许多散列函数在两种可用的Python和PHP,我百思不得其解,我怎么会去验证哈希值.
PHP的hash_hmac()允许我创建使用'钥匙’(或在这种情况下,字符串键)的哈希值.但是我该如何验证散列是否有效(即&sig=,不仅仅是由最终用户手动输入)&sig=abcdefg1234.
总结一下(抱歉这个长问题):我怎样才能验证我的服务器(证书/字符串)密钥是否已经签名/哈希(假设我无法通过重做所述数据的哈希来验证)?你对我应该选择哪条路线,Priv/pub-key还是HMAC有什么偏好?
任何大小的指针都非常感谢!提前致谢,
paw*_*ong 10
正如Henning Makholm指出的那样,HMAC是比公钥更好的选择.您应该针对特定方案考虑一些最佳实践,这些实践会影响您的选择:
在计算签名时,您需要以URL友好的方式对其进行编码(base64和base32是流行的选择)并选择HMAC算法(例如SHA-256),并确定您想要的签名位数.保持(将HMAC值减半)通常是安全的.如果您选择base64,请注意url-safe与非url-safe实现使用的不同字母表.
这是用于签名路径+查询字符串的伪代码实现(没有错误检查或腌制等):
const secret = ...;
def sign(path, querystring):
return path + "?" + querystring + "&sig=" + url_encode(base64_encode(hmacsha256(secret, path + "?" + querystring).truncate(16)))
def verify(path, querystring):
querystring_without_sig = remove_query_parameter(querystring, "sig")
sig = base64_decode(url_decode(get_query_parameter(querystring, "sig")))
if hmacsha256(secret, path + "?" + querystring_without_sig)[:16] != sig:
raise "invalid sig"
Run Code Online (Sandbox Code Playgroud)
建议使用HMAC SHA256,并提供所有常用语言版本.
Java的:
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(secret);
return mac.doFinal(value.getBytes());
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
hmac.new(secret, input, hashlib.sha256).digest()
Run Code Online (Sandbox Code Playgroud)
PHP:
hash_hmac("sha256", value, secret);
Run Code Online (Sandbox Code Playgroud)
HMAC是一种对称算法,因此没有单独的创建和检查算法.要检查,您只需计算应该最初计算的哈希值,并检查结果是否等于您实际从客户端获得的值.安全性取决于仅存在于服务器上的HMAC密钥.
除非您需要可以由不知道密钥的人验证签名,否则出于效率的原因,HMAC可能是比公钥系统更好的选择.创建或验证公钥签名可能需要几毫秒(几年前我每次操作时间为15毫秒时,一次实现),而HMAC非常快.
(哦,你不能在不知道它应该签名的数据的情况下验证任何类型的签名.就我所见,这没有任何意义).
| 归档时间: |
|
| 查看次数: |
8561 次 |
| 最近记录: |