标签: hmac

ruby中的hmac-sha1与C#HMACSHA1不同

我正在尝试从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

有什么好主意发生了什么?

c# ruby hash sha1 hmac

8
推荐指数
1
解决办法
4058
查看次数

带口音的NodeJS hmac摘要问题

我正在与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 node.js

8
推荐指数
1
解决办法
3178
查看次数

HMAC相对于对称加密有什么好处?

不知怎的,我没有得到HMAC.

我曾经问过,为什么在我们有公钥签名时我需要HMAC?,我想我得到了这个.更容易计算,等等......

但是,我没有得到的是为什么我们需要HMAC,分别是他们正在解决的问题.

根据我的理解,HMACs ......

  • 提供一种方法来确保消息没有被篡改,
  • 被一个秘密但对称的密钥"保护".

因此,为了计算HMAC(最初或用于验证),我确实需要知道密钥.

现在,如果我可以秘密地交换这个密钥而不用它被篡改,我也可以用同样的秘密方式交换信息,而不会被篡改,不是吗?

好的,现在你可以争辩说你只需要交换一次密钥,但是你可能有多条消息.没关系.

但是,如果我们现在拥有一个必须由所有各方保密的密钥,我们也可以使用相同的密钥直接使用对称加密来加密消息,不是吗?

当然,HMAC应该提供防止篡改的解决方案,但如果我只有一个没有密钥和合理加密算法的加密消息,我就不能以a)解密仍然有效的方式改变该加密消息,并且b)出现一个有意义的解密消息.

那么我真的需要一个HMAC呢?或者 - 我失踪的地方在哪里?

encryption hmac

8
推荐指数
1
解决办法
3180
查看次数

如何在JS中获取CryptoJS.HmacSHA256的摘要表示

我必须生成CryptoJS.HmacSHA256摘要(字节表示)的字符串表示.

我需要它,因为我必须复制python代码,在javascript中生成这样的摘要:

print hmac.new("secret", "test", hashlib.sha256).digest()

')?kb??>?y+??????:?o???H?   '
Run Code Online (Sandbox Code Playgroud)

目标是在javascript中复制上面代码的行为.

你能建议我怎么做吗?

javascript python cryptography hmac cryptojs

8
推荐指数
2
解决办法
1万
查看次数

dnx451 RC1 InMemorySymmetricSecurityKey发生了什么变化?

我一直在尝试使用简单的密钥创建和签署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)

.net c# oauth hmac jwt

8
推荐指数
2
解决办法
4519
查看次数

保护ASP.NET WEB API2的最佳方法,其中多个客户端使用它

当您有多个不同的客户端使用时,保护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-认证/

什么是最好的方法?

c# api asp.net-mvc token hmac

8
推荐指数
1
解决办法
1万
查看次数

Python 3 哈希 HMAC-SHA512

我正在为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)

python hash hmac sha512 python-3.x

8
推荐指数
1
解决办法
1万
查看次数

Swift 4 中的 HMAC SHA256

我有一个字符串和一个密钥,我想从中生成一个 HMAC SHA256。虽然我使用了 2 个库

IDZSwiftCommonCryptoCryptoSwift

这个答案

没有什么对我有用。我的真相来源是这两个网站

https://myeasywww.appspot.com/utility/free/online/Crypt_Decrypt-MD5-AES-HMAC-SHA-DES-RABBIT/en?command=UTILITY&ID=2

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)

cryptography hmac swift swift4 cryptoswift

8
推荐指数
3
解决办法
1万
查看次数

预请求 CryptoJS 脚本中出现“TypeError:无法读取未定义的属性‘sigBytes’”错误

使用 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,但仍然出现错误。

以下是每个变量的样本值:

  • 手机 - +639012345678
  • 值 - 100
  • 商家ID - TEST_MERCHANT1
  • 参考编号 - TEST_MERCHANT1-000001
  • 授权码 - …

hmac cryptojs postman postman-collection-runner postman-pre-request-script

8
推荐指数
1
解决办法
3万
查看次数

HMAC - 通过 Postman 进行 SHA256 身份验证

我正在尝试通过 Postman 模拟对我的 Rails 应用程序的 webhook POST 请求(在真实的工作流程中运行良好)。我找到了很多例子,但没有一个起作用 - 我不断收到 401 代码。我所做的是定义标题,Pre-request Script如下所示:

\n

邮递员标题

\n

JSPre-request Script基于此文档

\n
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

每个 Webhook 将使用 \xe2\x80\x8b X-AQID-Signature\xe2\x80\x8b 标头发送,该标头是通过使用 HMAC 方法和 SHA256 算法对请求的有效负载进行哈希处理而创建的,使用共享密钥作为盐。这意味着在收到有效负载后,您可以通过复制哈希方法来验证其完整性。

\n
\n

正如我所说,它在现实生活工作流程中运行良好,因此我在邮递员实现中遇到了错误。我错过了什么?

\n

javascript ruby-on-rails hmac postman postman-pre-request-script

8
推荐指数
2
解决办法
1万
查看次数