我正在尝试从ankoder.com测试API,并且在身份验证令牌的摘要计算方面存在问题.当我试图从C#调用时,样本是ruby.当我比较HMAC-SHA1之间的摘要结果时,我遇到了密码结果的问题.
为了便于在这里测试代码:
require 'hmac-sha1'
require 'digest/sha1'
require 'base64'
token="-Sat, 14 Nov 2009 09:47:53 GMT-GET-/video.xml-"
private_key="whatever"
salt=Digest::SHA1.hexdigest(token)[0..19]
passkey=Base64.encode64(HMAC::SHA1.digest(private_key, salt)).strip
Run Code Online (Sandbox Code Playgroud)
这给了我结果:"X/0EngsTYf7L8e7LvoihTMLetlM = \n"如果我在C#中尝试使用以下内容:
const string PrivateKey = "whatever";
var date = "Sat, 14 Nov 2009 09:47:53 GMT";//DateTime.Now.ToUniversalTime().ToString("ddd, dd MMM yyyy HH:mm:ss") + " GMT";
string token=string.Format("-{0}-GET-/video.xml-", date);
var salt_binary=SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(token));
var salt_hex=BitConverter.ToString(salt_binary).Replace("-", "").ToLower();
var salt =salt_hex.Substring(0,20);
var hmac_sha1 =
new HMACSHA1(Encoding.ASCII.GetBytes(salt));
hmac_sha1.Initialize();
var private_key_binary = Encoding.ASCII.GetBytes(PrivateKey);
var passkey_binary = hmac_sha1.ComputeHash(private_key_binary,0,private_key_binary.Length);
var passkey = Convert.ToBase64String(passkey_binary).Trim();
Run Code Online (Sandbox Code Playgroud)
salt的结果是一样的,但是密码结果是不同的--C#给了我:
QLC68XjQlEBurwbVwr7euUfHW/K =
两者都产生盐:f5cab5092f9271d43d2e
有什么好主意发生了什么?
我正在与Ruby,PHP和NodeJS并行进行以下代码的比较,使用该crypto
模块在NodeJS中获得不正确的响应.
PHP
hash_hmac('sha256', 'text', 'á');
Run Code Online (Sandbox Code Playgroud)
红宝石
OpenSSL::HMAC.hexdigest('sha256', 'á', 'text')
Run Code Online (Sandbox Code Playgroud)
的NodeJS
var signer = crypto.createHmac('sha256', 'á');
var expected = signer.update("text").digest('hex');
Run Code Online (Sandbox Code Playgroud)
Ruby和PHP都返回34b3ba4ea7e8ff214f2f36b31c6a6d88cfbf542e0ae3b98ba6c0203330c9f55b
,而NodeJS返回7dc85acba66d21e4394be4f8ead2a327c9f1adc64a99c710c98f60c425bd7411
.我注意到,如果我utf8_encode('á')
在PHP中尝试,它实际上给了我Node期望的结果.
我正在从文件中加载Node中的重音文本,如下所示:
JSON.parse(fs.readFileSync('keys.js', 'utf8'));
Run Code Online (Sandbox Code Playgroud)
我将如何在Node中更改我的代码以获得PHP和Ruby都存在的结果哈希?
谢谢!
不知怎的,我没有得到HMAC.
我曾经问过,为什么在我们有公钥签名时我需要HMAC?,我想我得到了这个.更容易计算,等等......
但是,我没有得到的是为什么我们需要HMAC,分别是他们正在解决的问题.
根据我的理解,HMACs ......
因此,为了计算HMAC(最初或用于验证),我确实需要知道密钥.
现在,如果我可以秘密地交换这个密钥而不用它被篡改,我也可以用同样的秘密方式交换信息,而不会被篡改,不是吗?
好的,现在你可以争辩说你只需要交换一次密钥,但是你可能有多条消息.没关系.
但是,如果我们现在拥有一个必须由所有各方保密的密钥,我们也可以使用相同的密钥直接使用对称加密来加密消息,不是吗?
当然,HMAC应该提供防止篡改的解决方案,但如果我只有一个没有密钥和合理加密算法的加密消息,我就不能以a)解密仍然有效的方式改变该加密消息,并且b)出现一个有意义的解密消息.
那么我真的需要一个HMAC呢?或者 - 我失踪的地方在哪里?
我必须生成CryptoJS.HmacSHA256
摘要(字节表示)的字符串表示.
我需要它,因为我必须复制python代码,在javascript中生成这样的摘要:
print hmac.new("secret", "test", hashlib.sha256).digest()
')?kb??>?y+??????:?o???H? '
Run Code Online (Sandbox Code Playgroud)
目标是在javascript中复制上面代码的行为.
你能建议我怎么做吗?
我一直在尝试使用简单的密钥创建和签署JwtSecurityToken.经过大量研究后,我发现所有示例似乎都使用InMemorySymmetricSecurityKey类,但不幸的是,这个类似乎不存在于最新版本的System.IdentityModel库中.
这些是我正在使用的依赖项:
"System.IdentityModel.Tokens": "5.0.0-rc1-211161024",
"System.IdentityModel.Tokens.Jwt": "5.0.0-rc1-211161024"
Run Code Online (Sandbox Code Playgroud)
我也尝试使用它的基类SymmetricSecurityKey但是在尝试创建令牌时我得到以下异常:
"Value cannot be null.\r\nParameter name: IDX10000: The parameter 'signatureProvider' cannot be a 'null' or an empty object."
Run Code Online (Sandbox Code Playgroud)
这是抛出异常的代码:
public static string CreateTokenHMAC()
{
HMACSHA256 hmac = new HMACSHA256(Convert.FromBase64String("test"));
var key = new SymmetricSecurityKey(hmac.Key);
var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature);
JwtSecurityToken token = _tokenHandler.CreateJwtSecurityToken(new SecurityTokenDescriptor()
{
Audience = AUDIENCE,
Issuer = ISSUER,
Expires = DateTime.UtcNow.AddHours(6),
NotBefore = DateTime.Now,
Claims = new List<Claim>()
{
new Claim(ClaimTypes.Email, "johndoe@example.com")
},
SigningCredentials …
Run Code Online (Sandbox Code Playgroud) 当您有多个不同的客户端使用时,保护WEB API的最佳方法是什么?每个客户端都应该拥有自己的API密钥才能连接.现在我已经阅读了不同的内容,但我仍然有一些问题.
我找到了这个:http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/#comments但是足够了?
所以基本上:1.客户端使用给定的用户名/密码连接2.客户端获取持有者令牌3.客户端在每个帖子中使用此令牌到api,直到时间戳结束
我还阅读了关于为每个客户提供API密钥的信息:http://bitoftech.net/2014/12/15/secure-asp-net-web-api-using-api-key-authentication- HMAC-认证/
什么是最好的方法?
我正在为https://poloniex.com/support/api/编写一个机器人
公共方法都可以正常工作,但交易 API 方法需要一些额外的技巧:
对交易 API 的所有调用都通过 HTTP POST 发送到https://poloniex.com/tradingApi,并且必须包含以下标头:
密钥 - 您的 API 密钥。
签名 - 查询的 POST 数据根据 HMAC-SHA512 方法由您的密钥的“秘密”签名。
此外,所有查询都必须包含“nonce”POST 参数。nonce 参数是一个整数,它必须始终大于之前使用的 nonce。
来自交易 API 的所有响应都是 JSON 格式。
我的 returnBalances 代码如下所示:
import hashlib
import hmac
from time import time
import requests
class Poloniex:
def __init__(self, APIKey, Secret):
self.APIKey = APIKey
self.Secret = Secret
def returnBalances(self):
url = 'https://poloniex.com/tradingApi'
payload = {
'command': 'returnBalances',
'nonce': int(time() * 1000),
}
headers = {
'Key': self.APIKey, …
Run Code Online (Sandbox Code Playgroud) 我有一个字符串和一个密钥,我想从中生成一个 HMAC SHA256。虽然我使用了 2 个库
IDZSwiftCommonCrypto和CryptoSwift
而这个答案
没有什么对我有用。我的真相来源是这两个网站
和
https://www.freeformatter.com/hmac-generator.html#ad-output
他们总是为我的情况生成正确的哈希键。知道什么可以在这里工作吗?一些代码示例
对于 IDZSwiftCommonCrypto
func getHMacSHA256(forMessage message: String, key: String) -> String? {
let hMacVal = HMAC(algorithm: HMAC.Algorithm.sha256, key: key).update(string: message)?.final()
if let encryptedData = hMacVal {
let decData = NSData(bytes: encryptedData, length: Int(encryptedData.count))
let base64String = decData.base64EncodedString(options: .lineLength64Characters)
print("base64String: \(base64String)")
return base64String
} else {
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
对于 CryptoSwift
let password: Array<UInt8> = Array(payload.utf8)
let salt: Array<UInt8> = Array("somekey".utf8)
let signedBody = try? HKDF(password: …
Run Code Online (Sandbox Code Playgroud) 使用 cryptojs 预请求脚本运行邮递员集合时,出现“TypeError:无法读取未定义的属性‘sigBytes’”错误。预请求脚本计算 hmac-sha256 签名,该签名也是要调用的主 API 参数的一部分。
下面是我的脚本:
let mobile = pm.environment.get('mobileNumber');
let value = pm.environment.get('value');
let merchantId = pm.environment.get('merchantId');
let referenceNumber = pm.environment.get('referenceNumber');
let authCode = pm.environment.get('authCode');
let secretKey = pm.environment.get('secretKey');
let string = mobile + value + merchantId + referenceNumber + authCode;
pm.environment.set('string', string);
let hmac = CryptoJS.HmacSHA256(string, secretKey);
pm.environment.set('hmac', hmac);
signature = "hmac256-" + hmac;
pm.environment.set('signature', signature);
Run Code Online (Sandbox Code Playgroud)
我已经尝试将字符串和 SecretKey 编码为 UTF-8、base64stringify、JSON stringify,但仍然出现错误。
以下是每个变量的样本值:
hmac cryptojs postman postman-collection-runner postman-pre-request-script
我正在尝试通过 Postman 模拟对我的 Rails 应用程序的 webhook POST 请求(在真实的工作流程中运行良好)。我找到了很多例子,但没有一个起作用 - 我不断收到 401 代码。我所做的是定义标题,Pre-request Script
如下所示:
JSPre-request Script
基于此文档
postman.setEnvironmentVariable("hmac", CryptoJS.HmacSHA256(request.data, \'my_secret_string\').toString(CryptoJS.digest));\n
Run Code Online (Sandbox Code Playgroud)\n但我仍然收到 401 错误。
\n我用来触发 webhook 的外部 API 文档明确指出:
\n\n\n每个 Webhook 将使用 \xe2\x80\x8b X-AQID-Signature\xe2\x80\x8b 标头发送,该标头是通过使用 HMAC 方法和 SHA256 算法对请求的有效负载进行哈希处理而创建的,使用共享密钥作为盐。这意味着在收到有效负载后,您可以通过复制哈希方法来验证其完整性。
\n
正如我所说,它在现实生活工作流程中运行良好,因此我在邮递员实现中遇到了错误。我错过了什么?
\njavascript ruby-on-rails hmac postman postman-pre-request-script
hmac ×10
c# ×3
cryptography ×2
cryptojs ×2
hash ×2
javascript ×2
postman ×2
python ×2
.net ×1
api ×1
asp.net-mvc ×1
cryptoswift ×1
encryption ×1
jwt ×1
node.js ×1
oauth ×1
python-3.x ×1
ruby ×1
sha1 ×1
sha512 ×1
swift ×1
swift4 ×1
token ×1