Files
base-golang/pkg/crypto/client/crypto/hmac.ts
2026-02-07 15:38:01 +08:00

55 lines
1.2 KiB
TypeScript

import { ISigner } from './interface';
/**
* HMAC签名器
*/
export class HMACSigner implements ISigner {
private key: CryptoKey | null = null;
constructor(keyString: string) {
this.importKey(keyString);
}
/**
* 导入密钥
*/
private async importKey(keyString: string): Promise<void> {
const encoder = new TextEncoder();
const keyData = encoder.encode(keyString);
this.key = await crypto.subtle.importKey(
'raw',
keyData,
{
name: 'HMAC',
hash: 'SHA-256',
},
false,
['sign', 'verify']
);
}
/**
* 生成签名
*/
async sign(data: Uint8Array): Promise<Uint8Array> {
if (!this.key) {
throw new Error('密钥未设置');
}
const signature = await crypto.subtle.sign('HMAC', this.key, data);
return new Uint8Array(signature);
}
/**
* 验证签名
*/
async verify(data: Uint8Array, signature: Uint8Array): Promise<boolean> {
if (!this.key) {
throw new Error('密钥未设置');
}
return await crypto.subtle.verify('HMAC', this.key, signature, data);
}
}