使用下面的规范,我需要在Android上创建oauth_signature.我正在寻找一个处理锅炉板代码的库,用于创建通过OAuth访问资源的签名.
构造一个签名"基本字符串",它由三个请求元素的串联组成:
- HTTP请求方法.
- 请求发送到的基本URL.此URL不应包含任何查询参数.在签署对Google服务的调用时,请参阅OAuth规范第9.1.2节,了解相关说明.
- 请求中参数的标准化字符串(不包括oauth_signature参数).这包括请求标头或正文中发送的参数,以及添加到请求URL的查询参数.要规范化字符串,请使用词典字节值排序对参数进行排序.有关规范化此字符串的更多详细信息,请参阅OAuth规范的第9.1.1节.
使用以下序列之一生成oauth_signature:
- 如果您的应用程序已注册且您正在使用HMAC-SHA1,请使用注册期间生成的OAuth"consumer secret"值; 此值显示在您域的注册页面上.
我有一个运行一些Java代码的tomcat服务器,允许用户使用API密钥进行身份验证.该请求使用使用SHA256创建的HMAC.我有一个Ruby客户端,我用它来发出请求,因为我刚接触加密,我很难让它生成匹配的HMAC.我试过不把它设为URL安全,并且匹配.所以我真的很想知道如何让Ruby客户端与URL安全版本匹配(因为我无法更改Java代码).它最后只有一个额外的=字符.在此先感谢您的帮助.
对于Ruby我使用1.9.3而对于Java我使用6u31以及来自apache的commons-codec-1.6.jar库.
码
红宝石:
require "openssl"
require "base64"
json_str = "{'community':'LG7B734A', 'login_id':'user1', 'time':'1331928899'}"
digest = OpenSSL::Digest::Digest.new("sha256")
key = [ "4cc45e4258121c3fec84147673e1bd88e51b1c177aafcfa2da72bd4655c9f933" ]
hmac = OpenSSL::HMAC.digest(digest, key.pack("H*"), json_str)
encoded_url_safe = Base64.urlsafe_encode64(hmac)
encoded = Base64.encode64(hmac)
puts("Encoded (Url Safe): " + encoded_url_safe)
puts("Encoded : " + encoded)
Run Code Online (Sandbox Code Playgroud)
Java的:
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Mac;
public class ExampleHMAC
{
public static void main(String[] args) throws Exception
{
String key = "4cc45e4258121c3fec84147673e1bd88e51b1c177aafcfa2da72bd4655c9f933";
byte[] keyBytes = Hex.decodeHex(key.toCharArray());
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "HmacSHA256");
Mac mac …
Run Code Online (Sandbox Code Playgroud) Facebook要求我创建appsecret_proof:https: //developers.facebook.com/docs/graph-api/securing-requests
我使用以下代码完成了此操作:
public string FaceBookSecret(string content, string key)
{
var encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(key);
byte[] messageBytes = encoding.GetBytes(content);
using (var hmacsha256 = new HMACSHA256(keyByte))
{
byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
return Convert.ToBase64String(hashmessage);
}
}
Run Code Online (Sandbox Code Playgroud)
一切看起来都不错,但facebook说appsecret_proof无效.我已登录,当我删除密钥时,我可以正常地完成所有操作.所以节省一些时间:
使用示例
dynamic results = client.Post("/" + model.PostAsId + "/feed", new { message = model.Message, appsecret_proof = FaceBookSecret(postAs.AuthToken, AppSecret) });
Run Code Online (Sandbox Code Playgroud)
我认为它可能与编码或其他东西有关,但说实话,我只是不知道.
我也在使用Facebook .net SDK,但这在文档中没有多少,并且似乎没有涉及与自动化,服务器端操作等有关的任何事情.
谢谢
我正在尝试使用Python来访问poloniex.com上的交易API,这是一种加密货币交换.要做到这一点,我必须遵循这个处方:
所有对交易API的调用都通过HTTP POST发送到https://poloniex.com/tradingApi,并且必须包含以下标题:
密钥 - 您的API密钥.
Sign - 根据HMAC-SHA512方法,由密钥的"秘密"签名的查询的POST数据.此外,所有查询都必须包含"nonce"POST参数.nonce参数是一个整数,必须始终大于之前使用的nonce.
这是我到目前为止所拥有的.我目前的问题是我不知道如何编译POST网址,以便可以在不先发送未完成请求的情况下对其进行签名.这显然不起作用.
import requests
import hmac
import hashlib
import time
headers = { 'nonce': '',
'Key' : 'myKey',
'Sign': '',}
payload = { 'command': 'returnCompleteBalances',
'account': 'all'}
secret = 'mySecret'
headers['nonce'] = int(time.time())
response = requests.post( 'https://poloniex.com/tradingApi', params= payload, headers= headers )
headers['Sign'] = hmac.new( secret, response.url, hashlib.sha512)
Run Code Online (Sandbox Code Playgroud) 我正在使用一个示例为 Web API 项目设置 HMAC 身份验证。原始示例源代码/项目可在此处获得:
我试图让 Postman 在它的预请求脚本中构建和发送 GET 请求。但是请求总是以 401 失败,我不知道为什么。
邮递员预请求脚本:
var AppId = "4d53bce03ec34c0a911182d4c228ee6c";
var APIKey = "A93reRTUJHsCuQSHR+L3GxqOJyDmQpCgps102ciuabc=";
var requestURI = "http%3a%2f%2flocalhost%3a55441%2fapi%2fv1%2fdata";
var requestMethod = "GET";
var requestTimeStamp = "{{$timestamp}}";
var nonce = "1";
var requestContentBase64String = "";
var signatureRawData = AppId + requestMethod + requestURI + requestTimeStamp + nonce + requestContentBase64String; //check
var signature = CryptoJS.enc.Utf8.parse(signatureRawData);
var secretByteArray = CryptoJS.enc.Base64.parse(APIKey);
var signatureBytes = CryptoJS.HmacSHA256(signature,secretByteArray)
var requestSignatureBase64String = CryptoJS.enc.Base64.stringify(signatureBytes);
postman.setGlobalVariable("key", "amx " + AppId + …
Run Code Online (Sandbox Code Playgroud) 我们使用以下代码针对C#中的敏感值生成HMac哈希
public string GenerateHMac(string key, string message)
{
var decodedKey = Convert.FromBase64String(key);
var hasher = new HMACSHA256(decodedKey);
var messageBytes = Encoding.Default.GetBytes(message);
var hash = hasher.ComputeHash(messageBytes);
return Convert.ToBase64String(hash);
}
Run Code Online (Sandbox Code Playgroud)
传入的密钥是256位base 64编码字符串.提出了一个问题,我们是否应该使用HMACSHA256,HMACSHA384或HMACSHA512来散列该值.
作为旁注; decodedKey
如果我使用HMACSHA512,我传递给构造函数的值是否需要是512位密钥?
我试过加密,这显然不起作用,因为它取决于节点运行.所以,我转向加密浏览,但我相信存在依赖性问题.如果有人可以提供帮助,我会非常感激.
作为参考,我之前使用过像这样的加密:
crypto.createHmac('md5', "MY_KEY").update('SOMETHING_TO_ENCRYPT').digest('hex');
Run Code Online (Sandbox Code Playgroud)
编辑
我正在尝试加密用密钥腌制的字符串.上面的代码是我之前用来实现的.我需要在React-Native中进行类似的操作.
当尝试使用crypto-browserify(我认为它可以在React-Native中工作)时,我在打包器中获得以下内容:
Unable to resolve module stream from /Users/kelseyregan/BitBucket/React-Native-core/reup/node_modules/plist-parser/node_modules/sax/lib/sax.js
Unable to resolve module string_decoder from /Users/kelseyregan/BitBucket/React-Native-core/reup/node_modules/plist-parser/node_modules/sax/lib/sax.js
Unable to resolve module stream from /Users/kelseyregan/BitBucket/React-Native-core/reup/node_modules/crypto-browserify/node_modules/create-hash/node_modules/cipher-base/index.js
Unable to resolve module string_decoder from /Users/kelseyregan/BitBucket/React-Native-core/reup/node_modules/crypto-browserify/node_modules/create-hash/node_modules/cipher-base/index.js
Unable to resolve module stream from /Users/kelseyregan/BitBucket/React-Native-core/reup/node_modules/crypto-browserify/node_modules/create-hmac/browser.js
Unable to resolve module stream from /Users/kelseyregan/BitBucket/React-Native-core/reup/node_modules/crypto-browserify/node_modules/browserify-cipher/node_modules/browserify-aes/node_modules/cipher-base/index.js
Unable to resolve module string_decoder from /Users/kelseyregan/BitBucket/React-Native-core/reup/node_modules/crypto-browserify/node_modules/browserify-cipher/node_modules/browserify-aes/node_modules/cipher-base/index.js
Unable to resolve module stream from /Users/kelseyregan/BitBucket/React-Native-core/reup/node_modules/crypto-browserify/node_modules/browserify-cipher/node_modules/browserify-des/node_modules/cipher-base/index.js
Unable to resolve module string_decoder from /Users/kelseyregan/BitBucket/React-Native-core/reup/node_modules/crypto-browserify/node_modules/browserify-cipher/node_modules/browserify-des/node_modules/cipher-base/index.js
Unable to resolve module stream from /Users/kelseyregan/BitBucket/React-Native-core/reup/node_modules/crypto-browserify/node_modules/browserify-sign/browser.js
Unable …
Run Code Online (Sandbox Code Playgroud) 我有以下用Java编写的代码
Mac mac = Mac.getInstance("HmacSHA1");
String secretKey ="sKey";
String content ="Hello";
byte[] secretKeyBArr = secretKey.getBytes();
byte[] contentBArr = content.getBytes();
SecretKeySpec secret_key = new SecretKeySpec(secretKeyBArr,"HmacSHA1");
byte[] secretKeySpecArr = secret_key.getEncoded();
mac.init(secret_key);
byte[] final = mac.doFinal(contentBArr);
Run Code Online (Sandbox Code Playgroud)
我想在C#中做同样的例子.所以,我写了下面的代码
HMACSHA1 hmacsha1 = new HMACSHA1();
string secretKey = "sKey";
string content = "Hello";
byte[] secretKeyBArr = Encoding.UTF8.GetBytes(secretKey);
byte[] contentBArr = Encoding.UTF8.GetBytes(content);
hmacsha1.Key = secretKeyBArr;
byte[] final = hmacsha1.ComputeHash(contentBArr);
Run Code Online (Sandbox Code Playgroud)
最终结果并不相同.secretKeyBArr和contentBArr是字节数组,它们的值在两个示例中都相同.未知的是传递给mac.init()的SecretKeySpec.那么,什么是C#中相同的同类?
我正在寻找在我正在构建的API中实现HMACSHA256请求签名.从我地理解https://tools.ietf.org/html/rfc4868,这是最好的秘密密钥是相同的位数的哈希算法(即SHA256密钥应该是256比特/ 32字节).
我可以使用C#中许多不同的随机数生成器之一,或者是否需要生成这些密钥的特定方法.
最后,亚马逊Web服务使用HMACSHA256,但他们提供的(至少对我来说)密钥是320比特/ 40字节(当关键是使用转换为字节UTF-8,看https://github.com/aws/ AWS-SDK-净/斑点/主/ AWSSDK/Amazon.Runtime /内部/认证/ AWS4Signer.cs#L205-L232).有没有理由使用散列算法超过需要,因为它被截断了?
这是我用来编码字符串的函数:
\n\n#include <openssl/evp.h>\n#include <openssl/hmac.h>\n\nunsigned char *mx_hmac_sha256(const void *key, int keylen,\n const unsigned char *data, int datalen,\n unsigned char *result, unsigned int *resultlen) {\n return HMAC(EVP_sha256(), key, keylen, data, datalen, result, resultlen);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n这是我如何调用它并检查结果:
\n\nchar *key = strdup("security is awesome");\nint keylen = strlen(key);\nconst unsigned char *data = (const unsigned char *)strdup("this is highly sensitive user data");\nint datalen = strlen((char *)data);\nunsigned char *result = NULL;\nunsigned int resultlen = -1;\n\nresult = mx_hmac_sha256((const void *)key, keylen, data, datalen, result, &resultlen);\n\nfor (unsigned int …
Run Code Online (Sandbox Code Playgroud)