Hướng dẫn createhmac javascript - javascript tạohmac

Despite all the sample code for signing and verifying hashing algorithms, I still had experiment and tweak quite a bit to make it work. Here's my working sample which I believe has all edge cases covered.

It's URL safe (i.e. doesn't need to be encoded), it takes an expiry time, and will not unexpectedly throw an exception. There is a dependency on Day.js, but you can replace that with another date library or roll your own date comparison.

Written in TypeScript:

// signature.ts
import * as crypto from 'crypto';
import * as dayjs from 'dayjs';

const key = 'some-random-key-1234567890';

const replaceAll = (
  str: string,
  searchValue: string,
  replaceValue: string,
) => str.split(searchValue).join(replaceValue);

const swap = (str: string, input: string, output: string) => {
  for (let i = 0; i < input.length; i++)
    str = replaceAll(str, input[i], output[i]);

  return str;
};

const createBase64Hmac = (message: string, expiresAt: Date) =>
  swap(
    crypto
      .createHmac('sha1', key)
      .update(`${expiresAt.getTime()}${message}`)
      .digest('hex'),
    '+=/', // Used to avoid characters that aren't safe in URLs
    '-_,',
  );

export const sign = (message: string, expiresAt: Date) =>
  `${expiresAt.getTime()}-${createBase64Hmac(message, expiresAt)}`;

export const verify = (message: string, hash: string) => {
  const matches = hash.match(/(.+?)-(.+)/);
  if (!matches) return false;

  const expires = matches[1];
  const hmac = matches[2];

  if (!/^\d+$/.test(expires)) return false;

  const expiresAt = dayjs(parseInt(expires, 10));
  if (expiresAt.isBefore(dayjs())) return false;

  const expectedHmac = createBase64Hmac(message, expiresAt.toDate());
  // Byte lengths must equal, otherwise crypto.timingSafeEqual will throw an exception
  if (hmac.length !== expectedHmac.length) return false;

  return crypto.timingSafeEqual(
    Buffer.from(hmac),
    Buffer.from(expectedHmac),
  );
};

You can use it like this:

import { sign, verify } from './signature';

const message = 'foo-bar';
const expiresAt = dayjs().add(1, 'day').toDate();
const hash = sign(message, expiresAt);

const result = verify(message, hash);

expect(result).toBe(true);

.

Nội dung chính ShowShow

  • Mac để làm gì?
  • Mac hoạt động như thế nào?
  • Yêu cầu cho mã xác thực tin nhắn an toàn
  • Ví dụ JavaScript
  • Kịch bản sử dụng cho HMAC
  • Xác minh-hmac-sha
  • Cách sử dụng
  • Xác minh-hmac-sha
  • Cách sử dụng

Tại hầu hết thời gian bạn sẽ chỉ cần sử dụng phương thức Message Authentication Code, and it also known as tag, and in communications sometimes is substituted by MIC or message integrity code.

Mac để làm gì?

Mac hoạt động như thế nào?

  • Yêu cầu cho mã xác thực tin nhắn an toàn
  • Ví dụ JavaScript

Kịch bản sử dụng cho HMAC

Mac hoạt động như thế nào?

  1. Yêu cầu cho mã xác thực tin nhắn an toànsender A wants to send a message M to a receiver B.
  2. Ví dụ JavaScripta key K.
  3. Kịch bản sử dụng cho HMACalgorithm S to calculate a tag T given the shared key K and the message M.
  4. MAC là viết tắt của mã xác thực tin nhắn và nó còn được gọi là thẻ và trong giao tiếp đôi khi được thay thế bằng mã tính toàn vẹn MIC hoặc tin nhắn.Message Authentication Code, and it also known as tag, and in communications sometimes is substituted by MIC or message integrity code.algorithm V to verify the authenticity of the message M given the key K and the tag T. That is, the algorithm returns accepted if neither the tag T nor the message M have been tampered with. Otherwise, it returns rejected.

Yêu cầu cho mã xác thực tin nhắn an toàn

Ví dụ JavaScript

Kịch bản sử dụng cho HMAC

MAC là viết tắt của mã xác thực tin nhắn và nó còn được gọi là thẻ và trong giao tiếp đôi khi được thay thế bằng mã tính toàn vẹn MIC hoặc tin nhắn.Message Authentication Code, and it also known as tag, and in communications sometimes is substituted by MIC or message integrity code.

Từ quan điểm chung, máy Mac là một thông tin bảo vệ một thông điệp bằng cách:

Xác minh tính toàn vẹn dữ liệu, tức là tin nhắn chưa bị giả mạo.

Ví dụ JavaScript

Kịch bản sử dụng cho HMAC

MAC là viết tắt của mã xác thực tin nhắn và nó còn được gọi là thẻ và trong giao tiếp đôi khi được thay thế bằng mã tính toàn vẹn MIC hoặc tin nhắn.Message Authentication Code, and it also known as tag, and in communications sometimes is substituted by MIC or message integrity code.

async function hmacSha256Hex(secret, message) {
const enc = new TextEncoder("utf-8");
const algorithm = { name: "HMAC", hash: "SHA-256" };
const key = await crypto.subtle.importKey(
"raw",
enc.encode(secret),
algorithm,
false, ["sign", "verify"]
);
const hashBuffer = await crypto.subtle.sign(
algorithm.name,
key,
enc.encode(message)
);
const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashHex = hashArray.map(
b => b.toString(16).padStart(2, '0')
).join('');
return hashHex;
}

Từ quan điểm chung, máy Mac là một thông tin bảo vệ một thông điệp bằng cách:

await hmacSha256Hex(
"key",
"The quick brown fox jumps over the lazy dog"
);
//f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8

Xác minh tính toàn vẹn dữ liệu, tức là tin nhắn chưa bị giả mạo.

Kịch bản sử dụng cho HMAC

MAC là viết tắt của mã xác thực tin nhắn và nó còn được gọi là thẻ và trong giao tiếp đôi khi được thay thế bằng mã tính toàn vẹn MIC hoặc tin nhắn.Message Authentication Code, and it also known as tag, and in communications sometimes is substituted by MIC or message integrity code.

  • Từ quan điểm chung, máy Mac là một thông tin bảo vệ một thông điệp bằng cách:
  • Xác minh tính toàn vẹn dữ liệu, tức là tin nhắn chưa bị giả mạo.
  • Xác minh tính xác thực của nó, xác nhận rằng nó đến từ người gửi đã nêu.
  • Điều này đặc biệt quan trọng khi thông điệp phải đi qua các kênh không có bảo đảm. Các trường hợp sử dụng cụ thể sẽ được liệt kê dưới đây.
  • Đối với Internet of Things (IoT) do chi phí tính toán thấp của nó, đặc biệt là các mạng lưới khu vực rộng công suất thấp.
  • Xác thực dựa trên HMAC (ví dụ, là xác thực chính được sử dụng bởi Amazon Web Services để xác thực yêu cầu).
  • Là một kỹ thuật giả danh dữ liệu, ví dụ để tuân thủ GDPR. Nhân tiện, điều này được khuyến nghị bởi Cơ quan Liên minh Châu Âu về An ninh mạng (ENISA).

Tôi có thể tạo thành công một HMAC thông qua NodeJS bằng cách sử dụng mã sau: (ví dụ thay đổi một chút từ: https://nodejs.org/api/crypto.html#cryptoCreatehmacalgorithm-key-opes)

Crypto.createHmac('sha256', Crypto.randomBytes(16))
   .update('I love cupcakes')
   .digest('hex');

Điều đó dẫn đến một giá trị như sau (Chữ ký HMAC dựa trên HEX):

import { sign, verify } from './signature';

const message = 'foo-bar';
const expiresAt = dayjs().add(1, 'day').toDate();
const hash = sign(message, expiresAt);

const result = verify(message, hash);

expect(result).toBe(true);
1

Làm cách nào để sử dụng chữ ký đó để xác minh rằng dữ liệu không bị thay đổi? (sử dụng nodejs, tất nhiên).

Giả định của tôi

Tôi giả sử có một cuộc gọi phương thức trong đó bạn cung cấp dữ liệu và chữ ký và bạn nhận được một boolean cho bạn biết liệu dữ liệu có bị thay đổi hay không - hoặc một cái gì đó tương tự.

Giải pháp khác?

Ồ, chờ đã, khi tôi viết rằng tôi bắt đầu nghĩ ...

Tôi có cần lưu trữ các byte ngẫu nhiên ban đầu mà tôi đã tạo (crypto.randombytes (16)) và chuyển chúng cho máy thu để chúng có thể tạo lại HMAC và xác minh rằng kết quả là như nhau (

import { sign, verify } from './signature';

const message = 'foo-bar';
const expiresAt = dayjs().add(1, 'day').toDate();
const hash = sign(message, expiresAt);

const result = verify(message, hash);

expect(result).toBe(true);
1) không?

Nếu điều đó đúng thì điều đó sẽ kỳ lạ, bởi vì tham số cho crypto.randombytes (16) được đặt tên là bí mật (trong ví dụ chính thức)*. Có vẻ như đó cần phải được giữ bí mật ??

Xin vui lòng cho tôi biết nếu có một cách để xác minh chữ ký ở phía nhận và cách tôi làm điều đó.

Tài liệu chính thức: Một chút khó hiểu

Đây là chức năng như được định nghĩa trong các tài liệu chính thức:

import { sign, verify } from './signature';

const message = 'foo-bar';
const expiresAt = dayjs().add(1, 'day').toDate();
const hash = sign(message, expiresAt);

const result = verify(message, hash);

expect(result).toBe(true);
3

Trong định nghĩa chức năng, bạn có thể thấy tham số thứ hai được đặt tên là

import { sign, verify } from './signature';

const message = 'foo-bar';
const expiresAt = dayjs().add(1, 'day').toDate();
const hash = sign(message, expiresAt);

const result = verify(message, hash);

expect(result).toBe(true);
4.

Tuy nhiên, trong ví dụ họ gọi nó là

await hmacSha256Hex(
"key",
"The quick brown fox jumps over the lazy dog"
);
//f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
0
const secret = 'abcdefg';
const hash = crypto.createHmac('sha256', secret)
               .update('I love cupcakes')
               .digest('hex');
console.log(hash);

1.3.4 & nbsp; • & nbsp; public & nbsp; • & nbsp; xuất bản 6 tháng trướcPublic • Published 6 months agoPublic • Published 6 months ago

  • Readme
  • Khám phá BetaBETABETA
  • 0 phụ thuộc
  • 1 người phụ thuộc
  • 6 phiên bản

Xác minh-hmac-sha

Gói đơn giản để xác minh HMAC với chữ ký SHA-256. Nó chỉ sử dụng mô -đun Crypto Node.js gốc như bạn thấy trong tài liệu chính thức. Tôi bọc tất cả chúng để bạn có thể làm điều này với ít dòng mã hơn.

Cách sử dụng

Tại hầu hết thời gian bạn sẽ chỉ cần sử dụng phương thức

await hmacSha256Hex(
"key",
"The quick brown fox jumps over the lazy dog"
);
//f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
1 trả về đúng/sai
const verifyHmac256 = require('verify-hmac-sha')
const secret = 'test-secret'
const payload = JSON.stringify({ example: 123 })
const signature = '0076b0ee1c6ea46ec31c8076b40447097497ab311866dd207fa7708e7a2bcc43'
console.log(
  // do verifyHmac256.encodeInBase64.verify in case of Base64 digest
  // verifyHmac256.encodeIn('base64') also works. Just pass in the encoding you prefer
  // I believe in most cases you will use either encodeInHex or encodeInBase64
  verifyHmac256.encodeInHex.verify({
    signature,
    secret,
    payload
  })
) // true

1.3.4 & nbsp; • & nbsp; public & nbsp; • & nbsp; xuất bản 6 tháng trướcPublic • Published 6 months agoPublic • Published 6 months ago

  • Readme
  • Khám phá BetaBETABETA
  • 0 phụ thuộc
  • 1 người phụ thuộc
  • 6 phiên bản

Xác minh-hmac-sha

Gói đơn giản để xác minh HMAC với chữ ký SHA-256. Nó chỉ sử dụng mô -đun Crypto Node.js gốc như bạn thấy trong tài liệu chính thức. Tôi bọc tất cả chúng để bạn có thể làm điều này với ít dòng mã hơn.

Cách sử dụng

Tại hầu hết thời gian bạn sẽ chỉ cần sử dụng phương thức

await hmacSha256Hex(
"key",
"The quick brown fox jumps over the lazy dog"
);
//f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
1 trả về đúng/sai
const verifyHmac256 = require('verify-hmac-sha')
const secret = 'test-secret'
const payload = JSON.stringify({ example: 123 })
const signature = '0076b0ee1c6ea46ec31c8076b40447097497ab311866dd207fa7708e7a2bcc43'
console.log(
  // do verifyHmac256.encodeInBase64.verify in case of Base64 digest
  // verifyHmac256.encodeIn('base64') also works. Just pass in the encoding you prefer
  // I believe in most cases you will use either encodeInHex or encodeInBase64
  verifyHmac256.encodeInHex.verify({
    signature,
    secret,
    payload
  })
) // true