前端实现TOTP加密

前端实现TOTP加密


6位TOTP密码

import CryptoJS from 'crypto-js/crypto-js'
function generateTOTP(secret) {
	const timeStep = 30; // 时间步长(秒)
	const currentTimestamp = Math.floor(Date.now() / 1000); // 获取当前时间的时间戳(秒)
	let timeStepCount = Math.floor(currentTimestamp / timeStep); // 计算当前时间步数
	// 将时间步数转换为字节数组
	const timeStepBytes = new Array(8);
	for (let i = 7; i >= 0; i--) {
		timeStepBytes[i] = timeStepCount & 0xff;
		timeStepCount >>>= 8;
	}

	// 通过 CryptoJS 计算 HMAC-SHA1
	const hmacDigest = CryptoJS.HmacSHA1(CryptoJS.lib.WordArray.create(Uint8Array.from(timeStepBytes)), CryptoJS.enc.Hex.parse(secret));

	// 截取哈希的最后4位,得到偏移值
	const offset = hmacDigest.words[hmacDigest.words.length - 1] & 0xf;

	// 从偏移值开始的4个字节中提取动态密码
	const dynamicPasswordBytes = hmacDigest.words.slice(offset, offset + 4);

	// 将动态密码的字节数组转换为整数
	let dynamicPasswordInt = ((dynamicPasswordBytes[0] & 0x7f) << 24 |
		(dynamicPasswordBytes[1] & 0xff) << 16 |
		(dynamicPasswordBytes[2] & 0xff) << 8 |
		(dynamicPasswordBytes[3] & 0xff)) % 1000000;

	// 将密码转换为6位数字的字符串
	let formattedPassword = dynamicPasswordInt.toString().padStart(6, '0');

	return formattedPassword;
}

function convertToHex(secret) {
	const byteArray = [];
	for (let i = 0; i < secret.length; i++) {
		byteArray.push(secret.charCodeAt(i));
	}
	let hexString = byteArray.map(byte => byte.toString(16).padStart(2, '0')).join('');
	return hexString;
}

//使用16进制的密钥调用 generateTOTP 函数
const secret = '你的密钥';  // 替换为你的密钥
const TOTP = generateTOTP(convertToHex(secret));
console.log('TOTP:', TOTP);

目前前端实现了,后端好像解密不了。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马码码1997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值