基于时间的一次密码TOTP

基于时间的一次密码TOTP相关算法 HOTP HMAC based One Time Password 基于 HMAC 的一次性口令 TOTP Time Based One Time Password 基于时间的一次性口令 HMAC Hash based message authenticati code 基于散列函数的消息认证码算法 HMAC

大家好,我是讯享网,很高兴认识大家。

相关算法


  • HOTP(HMAC-based One-Time Password,基于HMAC的一次性口令)
  • TOTP(Time-Based One-Time Password,基于时间的一次性口令)
  • HMAC(Hash-based message authentication code,基于散列函数的消息认证码算法)

HMAC


  • 算法公式 HMAC(K, m) = H((K’ xor opad) || H ((K’ xor ipad) || m))
    • H 散列函数
    • K 共享密钥
    • K’ 通过K(密钥)计算所得(当散列函数是SHA-1, MD5, RIPEMD-128/160,K’大小为64字节不足后面填充0)
    • xor 异或
    • opad 外层HASH填充值,0x5c5c5c….长度与K’相当
    • ipad 内层HASH填充值,0x….长度与K’相当
    • m 一个消息输入
    • || 表示连接
  • 简化理解 sha1(opad.sha1(ipad.m))
  • 计算结果 根据所选散列函数变动,sha1为例会得到一个20字节40位的16进制
  • PHP自带 hash_hmac ( string algo,string data , string key[,bool raw_output = false ] )
  • 代码示例
 function my_hash($algo, $key, $msg) { 
    $blocksize = '64'; if (strlen($key) > $blocksize) $key = hash($algo, $key); if (strlen($key) < $blocksize) $key = str_pad($key, $blocksize, chr(0x00)); $o_pad = str_repeat(chr(0x5c), $blocksize) ^ $key; $i_pad = str_repeat(chr(0x36), $blocksize) ^ $key; return hash($algo, $o_pad. hash($algo, $i_pad. $msg, true)); } 

讯享网

HOTP


  • 算法公式 HOTP(K,C) = (Truncate(HMAC(K,C)) & 0x7FFFFFFF) mod 10d
    • C 计数器,对应HMAC中的m
    • & 与
    • T HMAC sha1后得到的结果太长,经过Truncate处理后我会得到一个32bit的无附号整数
    • mod 取余,与10的d次方模运算得到d位的一个数字口令
    • Truncate代码示例
讯享网 function truncate($hash) { 
    $offset = ord($hash[19]) & 0xf; return ( ((ord($hash[$offset+0]) & 0x7f) << 24 ) | ((ord($hash[$offset+1]) & 0xff) << 16 ) | ((ord($hash[$offset+2]) & 0xff) << 8 ) | (ord($hash[$offset+3]) & 0xff) ) % pow('10', '6'); } 

TOTP


  • 算法公式 TOTP = HOTP(K, TC)
    • TC floor((unixtime(now) − unixtime(T0)) / TS)
    • T0 开始计算的时间步长
    • TS 时间步长,默认30出于安全与考虑不宜过大
  • 代码片断
 function totp($secretKey, $f2, $len=6) { 
    $hash = hash_hmac ('sha1', $data, $key, true); return str_pad(self::truncateHash($hash), $len, '0', STR_PAD_LEFT); }

关键点


  • 密钥共享
  • 时间戳/计数器同步与混淆

相关资料


  • RFC 6238 - TOTP: Time-Based One-Time Password Algorithm
  • RFC 4226 - HOTP: An HMAC-Based One-Time Password Algorithm
  • RFC 2104 - HMAC: Keyed-Hashing for Message Authentication
小讯
上一篇 2025-02-08 21:20
下一篇 2025-04-01 18:23

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/43636.html