ആധുനിക വെബ് സുരക്ഷയിലെ അടിസ്ഥാന ക്രിപ്റ്റോഗ്രാഫിക് പ്രോട്ടോക്കോളുകളിൽ, RFC 6238 (TOTP: Time-Based One-Time Password Algorithm) അതിന്റെ ഗണിതപരമായ ലാളിത്യം കൊണ്ട് എടുത്തുനിൽക്കുന്നു. ഇതിന് നെറ്റ്വർക്ക് ഹാൻഡ്ഷെയ്ക്കുകളോ കേന്ദ്രീകൃത പബ്ലിക് കീ ഇൻഫ്രാസ്ട്രക്ചറോ (PKI) ക്ലൗഡ് ആശയവിനിമയങ്ങളോ ആവശ്യമില്ല. പങ്കിട്ട ഒരു Base32 രഹസ്യ കീയും ഭൗതിക Unix സമയത്തിന്റെ മാറ്റമില്ലാത്ത മുന്നേറ്റവും മാത്രം ഉപയോഗിച്ച്, ക്ലയന്റും സെർവറും ഓരോ 30 സെക്കൻഡിലും 100% ഗണിതപരമായ കൃത്യതയോടെ ഒരേപോലുള്ള താൽക്കാലിക 6-അക്ക ഓതന്റിക്കേഷൻ ടോക്കണുകൾ കണക്കാക്കുന്നു.
ഈ സമഗ്രമായ ഗൈഡിൽ, ബ്ലാക്ക്-ബോക്സ് തേർഡ് പാർട്ടി ലൈബ്രറികൾ (pyotp അല്ലെങ്കിൽ otplib പോലുള്ളവ) ഒഴിവാക്കി, Python, JavaScript, Go എന്നിവയിൽ പൂർണ്ണമായ RFC 6238 ക്രിപ്റ്റോഗ്രാഫിക് പൈപ്പ്ലൈൻ തുടക്കം മുതൽ നിർമ്മിക്കുകയും ഓരോ ഘട്ടവും ഔദ്യോഗിക IETF ടെസ്റ്റ് വെക്ടറുകൾ ഉപയോഗിച്ച് സാധൂകരിക്കുകയും ചെയ്യുന്നു.
01. സമയത്തെ അടിസ്ഥാനമാക്കിയുള്ള ഓതന്റിക്കേഷന്റെ പ്രത്യേകത
TOTP മനസ്സിലാക്കുന്നതിന്, അതിന്റെ മുൻഗാമിയായ RFC 4226 HOTP (HMAC-Based One-Time Password) ആദ്യം പരിശോധിക്കേണ്ടതുണ്ട്.
HOTP-യിൽ, ക്ലയന്റും സെർവറും ഒരു ഇവന്റ് കൗണ്ടർ $C$ പങ്കിടുന്നു. ഉപയോക്താവ് ഒരു ടോക്കൺ ജനറേറ്റ് ചെയ്യുമ്പോഴെല്ലാം, കൗണ്ടർ വർദ്ധിക്കുകയും ($C = C + 1$), ടോക്കൺ $\text{HMAC-SHA-1}(K, C)$-ൽ നിന്ന് രൂപപ്പെടുത്തുകയും ചെയ്യുന്നു. ഗണിതപരമായി സുരക്ഷിതമാണെങ്കിലും, HOTP-യ്ക്ക് ഒരു പ്രവർത്തനപരമായ ന്യൂനതയുണ്ടായിരുന്നു: കൗണ്ടർ ഡിസിൻക്രണൈസേഷൻ (counter desynchronization). ഒരു ഉപയോക്താവ് അബദ്ധവശാൽ പോക്കറ്റിലിരിക്കുന്ന ഹാർഡ്വെയർ ഉപകരണത്തിലെ ബട്ടൺ അഞ്ച് തവണ അമർത്തിയാൽ, ക്ലയന്റ് കൗണ്ടർ $C=6$ ആവുകയും എന്നാൽ സെർവർ $C=1$-ൽ തന്നെ തുടരുകയും ചെയ്യും. ഇത് ലോഗിൻ നിരസിക്കപ്പെടാൻ കാരണമാകുന്നു.
2011 മെയ് മാസത്തിൽ N. M'Raihi, S. Machani, M. Pei, J. Rydell എന്നിവർ പ്രസിദ്ധീകരിച്ച RFC 6238, വർദ്ധിച്ചുവരുന്ന പൂർണ്ണസംഖ്യയ്ക്ക് പകരം സ്റ്റാൻഡേർഡ് Unix എപ്പോക്ക് സമയം ഉപയോഗിച്ച് കൗണ്ടർ ഡിസിങ്ക് പ്രശ്നം പൂർണ്ണമായി പരിഹരിച്ചു. ഭൗതിക സമയം ലോകമെമ്പാടും ഒരേപോലെ മുന്നോട്ട് പോകുന്നതിനാൽ, ഒരു നെറ്റ്വർക്ക് പാക്കറ്റ് പോലും കൈമാറാതെ തന്നെ ക്ലയന്റും സെർവറും ഒരേ സമയം അവയുടെ ആന്തരിക കൗണ്ടറുകൾ അപ്ഡേറ്റ് ചെയ്യുന്നു.
02. TOTP-യുടെ 5 ക്രിപ്റ്റോഗ്രാഫിക് ഗണിത ഘട്ടങ്ങൾ
ഒരു 16-അക്ഷര Base32 സീഡ് (ഉദാ: JBSWY3DPEHPK3PXP) 6-അക്ക കോഡാക്കി (ഉദാ: 284915) മാറ്റുന്നതിൽ കൃത്യമായ അഞ്ച് ക്രിപ്റ്റോഗ്രാഫിക് ഘട്ടങ്ങൾ ഉൾപ്പെടുന്നു:
സേവന എൻറോൾമെന്റ് കീകൾ RFC 4648 Base32 ഫോർമാറ്റിൽ A-Z, 2-7 അക്ഷരങ്ങൾ ഉപയോഗിച്ച് എൻകോഡ് ചെയ്തിരിക്കുന്നു (ആശയക്കുഴപ്പമുണ്ടാക്കുന്ന 0, 1, 8, 9 എന്നിവ ഒഴിവാക്കുന്നു). അൽഗോരിതം ആദ്യം സ്പെയ്സുകൾ ഒഴിവാക്കി, നീളം 8-ന്റെ ഗുണിതമാക്കാൻ പാഡിംഗ് (=) ചേർത്ത് ഈ സ്ട്രിംഗ് സാധാരണവൽക്കരിക്കുകയും, തുടർന്ന് അതിനെ ബൈനറി കീ ബൈറ്റുകളായി ($K$) ഡീകോഡ് ചെയ്യുകയും ചെയ്യുന്നു.
നിലവിലെ Unix ടൈംസ്റ്റാമ്പ് (1970 ജനുവരി 1 UTC മുതൽ കഴിഞ്ഞ സെക്കൻഡുകൾ) ഒരു പൂർണ്ണസംഖ്യാ കൗണ്ടർ $T$-ലേക്ക് കണക്കാക്കുന്നു:
ഇവിടെ സാധാരണ പാരാമീറ്ററുകൾ $T_0 = 0$, സ്റ്റെപ്പ് ദൈർഘ്യം $X = 30$ സെക്കൻഡ് ആണ്. ഈ പൂർണ്ണസംഖ്യ $T$ പിന്നീട് 8-ബൈറ്റ് ബിഗ്-എൻഡിയൻ (Big-Endian) 64-ബിറ്റ് അൺസൈൻഡ് ഇന്റിജറായി എൻകോഡ് ചെയ്യുന്നു.
യഥാർത്ഥ കീ ബൈറ്റുകൾ $K$ രഹസ്യ കീയായി ഉപയോഗിച്ച്, 8-ബൈറ്റ് ബിഗ്-എൻഡിയൻ ടൈം ബഫറിന്മേൽ HMAC-SHA1 ഡൈജസ്റ്റ് കണക്കാക്കുന്നു, ഇത് 20-ബൈറ്റ് (160-ബിറ്റ്) മെസ്സേജ് ഓതന്റിക്കേഷൻ ഹാഷ് $HS$ നൽകുന്നു:
20 ബൈറ്റുകളെ ഒരു പൂർണ്ണസംഖ്യയാക്കി മാറ്റാൻ RFC 4226 ഡൈനാമിക് ട്രങ്കേഷൻ നിർദ്ദേശിക്കുന്നു:
- ഓഫ്സെറ്റ് കണ്ടെത്തൽ: അവസാന ബൈറ്റ് $HS[19]$ പരിശോധിച്ച്, അതിന്റെ താഴത്തെ 4 ബിറ്റുകൾ വേർതിരിച്ചെടുക്കാൻ
0x0Fഉപയോഗിച്ച് മാസ്ക് ചെയ്യുന്നു. ഇത് 0 മുതൽ 15 വരെയുള്ള ഒരു ഓഫ്സെറ്റ് നൽകുന്നു:Offset = HS[19] & 0x0F; - 4 ബൈറ്റുകൾ സ്ലൈസ് ചെയ്യുക: ഓഫ്സെറ്റിൽ തുടങ്ങി തുടർച്ചയായ 4 ബൈറ്റുകൾ വേർതിരിക്കുന്നു: $P = HS[Offset \dots Offset+3]$;
- സൈൻ ബിറ്റ് മാസ്ക് ചെയ്യുക: സൈൻഡ് ഇന്റിജർ ഓവർഫ്ലോ തടയാൻ മോസ്റ്റ് സിഗ്നിഫിക്കന്റ് ബിറ്റ് (MSB)
0x7Fഉപയോഗിച്ച് മാസ്ക് ചെയ്യുന്നു:
BinaryCode = ((P[0] & 0x7F) << 24) | ((P[1] & 0xFF) << 16) | ((P[2] & 0xFF) << 8) | (P[3] & 0xFF)
അവസാനമായി, സാധാരണ 6-അക്ക ടോക്കണുകൾ ലഭിക്കാൻ BinaryCode-നെ മോഡുലോ $10^6$ (1,000,000) ഉപയോഗിച്ച് ലഘൂകരിക്കുന്നു. സ്ഥിരമായ 6-അക്ക ഔട്ട്പുട്ട് ഉറപ്പാക്കാൻ ഇടത് വശത്ത് പൂജ്യങ്ങൾ (zeroes) ചേർക്കുന്നു:
03. റണ്ണബിൾ കോഡ് 1: Python 3 സ്റ്റാൻഡേർഡ് ലൈബ്രറി
ഈ പൂർണ്ണമായ ഇമ്പ്ലിമെന്റേഷൻ Python-ന്റെ അന്തർനിർമ്മിത base64, struct, hmac, hashlib മൊഡ്യൂളുകൾ ഉപയോഗിക്കുന്നു; ബാഹ്യ pip പാക്കേജുകൾ ഒന്നും ആവശ്യമില്ല:
import base64 import hashlib import hmac import struct import timedef generate_totp(secret_base32: str, timestamp: int = None, step: int = 30, digits: int = 6) -> str: """ Generate an RFC 6238 compliant TOTP token. :param secret_base32: Shared secret key in Base32 format (e.g., ‘JBSWY3DPEHPK3PXP’) :param timestamp: Unix epoch timestamp in seconds. Defaults to time.time() :param step: Time-step window in seconds (default: 30) :param digits: Number of output digits (default: 6) :return: Left-padded OTP string (e.g., ‘045812’) """ if timestamp is None: timestamp = int(time.time())
# 1. Normalize Base32 string and append '=' padding characters normalized_secret = secret_base32.replace(" ", "").upper() padding_needed = (8 - len(normalized_secret) % 8) % 8 normalized_secret += "=" * padding_needed key_bytes = base64.b32decode(normalized_secret) # 2. Compute 64-bit big-endian time-step counter T time_counter = timestamp // step time_bytes = struct.pack(">Q", time_counter) # 8 bytes big-endian unsigned long long # 3. Calculate HMAC-SHA1 digest (20 bytes) hmac_digest = hmac.new(key_bytes, time_bytes, hashlib.sha1).digest() # 4. Perform Dynamic Truncation offset = hmac_digest[-1] & 0x0F # Lower 4 bits of the 20th byte # Unpack 4 bytes at offset and clear MSB sign bit binary_code = struct.unpack(">I", hmac_digest[offset : offset + 4])[0] & 0x7FFFFFFF # 5. Modulo arithmetic and zero-fill formatting otp_code = binary_code % (10 ** digits) return str(otp_code).zfill(digits)
if name == “main”: test_secret = “JBSWY3DPEHPK3PXP” print(f”Generated TOTP Code: {generate_totp(test_secret)}”)
04. റണ്ണബിൾ കോഡ് 2: JavaScript & Node.js Crypto
നേറ്റീവ് crypto.createHmac ഉപയോഗിച്ചുള്ള ബാക്കെൻഡ് Node.js റൺടൈമുകൾക്കായുള്ള പ്യുവർ JavaScript നടപ്പിലാക്കൽ:
const crypto = require('crypto');// RFC 4648 Base32 Decoder in Pure JavaScript function base32Decode(base32Str) { const alphabet = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ234567’; const cleaned = base32Str.replace(/=+$/, ”).toUpperCase().replace(/\s+/g, ”); let bits = 0, value = 0, index = 0; const output = new Uint8Array(Math.floor((cleaned.length * 5) / 8));
for (let i = 0; i < cleaned.length; i++) { const val = alphabet.indexOf(cleaned[i]); if (val === -1) continue; value = (value << 5) | val; bits += 5; if (bits >= 8) { output[index++] = (value >>> (bits - 8)) & 255; bits -= 8; } } return Buffer.from(output.buffer, 0, index); }
function generateTOTP(secretBase32, timestamp = Math.floor(Date.now() / 1000), step = 30, digits = 6) { const key = base32Decode(secretBase32); const counter = Math.floor(timestamp / step);
// Allocate 8-byte buffer in Big-Endian format const buffer = Buffer.alloc(8); buffer.writeBigUInt64BE(BigInt(counter), 0);
// Compute HMAC-SHA1 const hmac = crypto.createHmac(‘sha1’, key).update(buffer).digest();
// Dynamic Truncation const offset = hmac[hmac.length - 1] & 0x0f; const binary = ((hmac[offset] & 0x7f) << 24) | ((hmac[offset + 1] & 0xff) << 16) | ((hmac[offset + 2] & 0xff) << 8) | (hmac[offset + 3] & 0xff);
const otp = binary % (10 ** digits); return otp.toString().padStart(digits, ‘0’); }
console.log(“Calculated TOTP:”, generateTOTP(“JBSWY3DPEHPK3PXP”));
W3C Web Crypto API വഴിയുള്ള ക്ലയന്റ്-സൈഡ് ബ്രൗസർ എക്സിക്യൂഷൻ:
100% ഓഫ്ലൈൻ സുരക്ഷ ആവശ്യമുള്ള ആധുനിക വെബ് ആപ്ലിക്കേഷനുകൾക്കായി (2FA-Tool നിർമ്മിച്ചിരിക്കുന്ന അതേ ആർക്കിടെക്ചർ), ബാഹ്യ npm പാക്കേജുകളൊന്നുമില്ലാതെ തന്നെ ബ്രൗസർ സാൻഡ്ബോക്സിൽ W3C Web Crypto API അസിൻക്രണസ് ക്രിപ്റ്റോഗ്രാഫിക് പ്രിമിറ്റീവുകൾ നൽകുന്നു:
async function generateBrowserTOTP(secretBase32, timestamp = Math.floor(Date.now() / 1000)) { const keyBytes = base32Decode(secretBase32); const counter = Math.floor(timestamp / 30);// 1. Import raw secret key into SubtleCrypto const cryptoKey = await window.crypto.subtle.importKey( “raw”, keyBytes, { name: “HMAC”, hash: { name: “SHA-1” } }, false, [“sign”] );
// 2. Encode 8-byte Big-Endian counter buffer const buffer = new ArrayBuffer(8); const view = new DataView(buffer); view.setBigUint64(0, BigInt(counter), false); // false = Big-Endian
// 3. Perform cryptographic HMAC sign const signature = await window.crypto.subtle.sign(“HMAC”, cryptoKey, buffer); const hmacResult = new Uint8Array(signature);
// 4. Dynamic Truncation const offset = hmacResult[hmacResult.length - 1] & 0x0f; const binary = ((hmacResult[offset] & 0x7f) << 24) | ((hmacResult[offset + 1] & 0xff) << 16) | ((hmacResult[offset + 2] & 0xff) << 8) | (hmacResult[offset + 3] & 0xff);
const otp = binary % 1000000; return otp.toString().padStart(6, ‘0’); }
05. റണ്ണബിൾ കോഡ് 3: പ്രൊഡക്ഷൻ Golang (Go)
ഉയർന്ന ത്രൂപുട്ടുള്ള മൈക്രോ സർവീസുകൾക്കായി Go-യുടെ സ്റ്റാൻഡേർഡ് ലൈബ്രറിയിലെ കരുത്തുറ്റ നടപ്പിലാക്കൽ:
package mainimport ( “crypto/hmac” “crypto/sha1” “encoding/base32” “encoding/binary” “fmt” “math” “strings” “time” )
// GenerateTOTP computes standard RFC 6238 time-based tokens func GenerateTOTP(secretBase32 string, timestamp int64, step int64, digits int) (string, error) { // 1. Sanitize Base32 seed and decode cleaned := strings.ToUpper(strings.ReplaceAll(secretBase32, ” ”, "")) key, err := base32.StdEncoding.WithPadding(base32.NoPadding).DecodeString(cleaned) if err != nil { key, err = base32.StdEncoding.DecodeString(cleaned) if err != nil { return "", err } }
// 2. Encode 64-bit Big-Endian time-step counter counter := uint64(timestamp / step) buf := make([]byte, 8) binary.BigEndian.PutUint64(buf, counter) // 3. Compute HMAC-SHA1 mac := hmac.New(sha1.New, key) mac.Write(buf) hash := mac.Sum(nil) // 4. Dynamic Truncation offset := hash[len(hash)-1] & 0x0f binaryCode := binary.BigEndian.Uint32(hash[offset:offset+4]) & 0x7fffffff // 5. Modulo arithmetic mod := uint32(math.Pow10(digits)) otp := binaryCode % mod format := fmt.Sprintf("%%0%dd", digits) return fmt.Sprintf(format, otp), nil}
func main() { code, err := GenerateTOTP(“JBSWY3DPEHPK3PXP”, time.Now().Unix(), 30, 6) if err != nil { panic(err) } fmt.Printf(“Golang Computed TOTP: %s\n”, code) }
06. RFC 6238 അപ്പൻഡിക്സ് B ടെസ്റ്റ് വെക്ടറുകൾ
സ്റ്റാൻഡേർഡ് പാലിക്കുന്നുണ്ടെന്ന് തെളിയിക്കുന്നതിന്, ഓരോ ക്രിപ്റ്റോഗ്രാഫിക് ഇമ്പ്ലിമെന്റേഷനും IETF RFC 6238 അപ്പൻഡിക്സ് B-യിൽ പ്രസിദ്ധീകരിച്ച ഔദ്യോഗിക ടെസ്റ്റ് വെക്ടറുകൾ ഉപയോഗിച്ച് പരിശോധിക്കേണ്ടതാണ്.
ഔദ്യോഗിക ടെസ്റ്റ് സ്യൂട്ട് "12345678901234567890" (20 ബൈറ്റുകൾ) എന്ന ASCII സീക്രട്ടാണ് ഉപയോഗിക്കുന്നത്, ഇത് Base32-ൽ ഇപ്രകാരം എൻകോഡ് ചെയ്യുന്നു:
GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ (30 സെക്കൻഡ് സ്റ്റെപ്പുകളുള്ള 8-അക്ക ഔട്ട്പുട്ടുകൾക്കായി വിലയിരുത്തപ്പെടുന്നു):
| Unix എപ്പോക്ക് ടൈംസ്റ്റാമ്പ് | UTC തീയതി & സമയം | RFC ഔദ്യോഗിക പ്രതീക്ഷിക്കുന്ന കോഡ് | പരിശോധനാ ഫലം |
|---|---|---|---|
| 59 | 1970-01-01 00:00:59 | 94287082 | ✓ വിജയിച്ചു (കൃത്യമായ പൊരുത്തം) |
| 1111111109 | 2005-03-18 01:58:29 | 07081804 | ✓ വിജയിച്ചു (കൃത്യമായ പൊരുത്തം) |
| 1111111111 | 2005-03-18 01:58:31 | 14050471 | ✓ വിജയിച്ചു (കൃത്യമായ പൊരുത്തം) |
| 1234567890 | 2009-02-13 23:31:30 | 89005924 | ✓ വിജയിച്ചു (കൃത്യമായ പൊരുത്തം) |
| 2000000000 | 2033-05-18 03:33:20 | 69279037 | ✓ വിജയിച്ചു (കൃത്യമായ പൊരുത്തം) |
07. പ്രൊഡക്ഷൻ എഞ്ചിനീയറിംഗ്: ക്ലോക്ക് സ്ക്യൂ, റീപ്ലേ & ലിമിറ്റുകൾ
ഉയർന്ന ലഭ്യതയുള്ള എന്റർപ്രൈസ് ഓതന്റിക്കേഷൻ സിസ്റ്റങ്ങളിൽ TOTP പരിശോധന വിന്യസിക്കുമ്പോൾ, മൂന്ന് നിർണായക സുരക്ഷാ മാനദണ്ഡങ്ങൾ പാലിക്കേണ്ടതുണ്ട്:
മൊബൈൽ ക്ലോക്കിലെ ചെറിയ വ്യത്യാസങ്ങൾ കാരണം, സെർവറുകൾ [T - 1, T, T + 1] എന്ന വിൻഡോ പരിശോധിക്കേണ്ടതാണ് (മുമ്പത്തെ 30 സെക്കൻഡ്, നിലവിലെ 30 സെക്കൻഡ്, അടുത്ത 30 സെക്കൻഡ്). ഈ വിൻഡോ $\pm 1$ സ്റ്റെപ്പിനപ്പുറം വികസിപ്പിക്കരുത്; കാരണം ഓരോ അധിക സ്റ്റെപ്പും റീപ്ലേ അറ്റാക്ക് റിസ്ക് 30 സെക്കൻഡ് വീതം വർദ്ധിപ്പിക്കുന്നു.
വിജയകരമായ ഉപയോഗത്തിന് ശേഷം ഒരു ടോക്കൺ ഉടനടി അസാധുവാക്കണം. Redis അല്ലെങ്കിൽ ഇൻ-മെമ്മറി കാഷെയിൽ Last_Verified_Time_Step സംഭരിക്കുക. ഒരു ക്ലയന്റ് ഒരേ 30 സെക്കൻഡ് വിൻഡോയ്ക്കുള്ളിൽ ഇതേ ടോക്കൺ വീണ്ടും സമർപ്പിക്കാൻ ശ്രമിച്ചാൽ, മാൻ-ഇൻ-ദി-മിഡിൽ റീപ്ലേ ആക്രമണങ്ങൾ തടയുന്നതിനായി ആ അഭ്യർത്ഥന നിരസിക്കുക.
6-അക്ക കോഡുകൾക്ക് 1,000,000 സാധ്യതകൾ മാത്രമുള്ളതിനാൽ, പരിരക്ഷയില്ലാത്ത എൻഡ്പോയിന്റുകളിൽ അതിവേഗം ബ്രൂട്ട്-ഫോഴ്സ് ആക്രമണം നടത്താൻ കഴിയും. തുടർച്ചയായ 3 പരാജയങ്ങൾക്ക് ശേഷം പ്രോഗ്രസ്സീവ് കാലതാമസങ്ങളും അക്കൗണ്ട് ലോക്കൗട്ടും നടപ്പിലാക്കുക. ടൈമിംഗ് അറ്റാക്കുകൾ തടയാൻ കോഡിൽ കോൺസ്റ്റന്റ്-ടൈം ഫംഗ്ഷനുകൾ ഉപയോഗിച്ച് താരതമ്യം നടത്തുക (ഉദാഹരണത്തിന് Go-യിൽ crypto/subtle.ConstantTimeCompare അല്ലെങ്കിൽ Node.js-ൽ crypto.timingSafeEqual).
08. പതിവായി ചോദിക്കുന്ന ചോദ്യങ്ങൾ (FAQ)
ചോദ്യം 1: SHA-1 സുരക്ഷിതമല്ലെന്നിരിക്കെ, എന്തുകൊണ്ടാണ് TOTP ഇപ്പോഴും HMAC-SHA1 ഡിഫോൾട്ടായി ഉപയോഗിക്കുന്നത്? ▼
SHA-1-നെതിരെയുള്ള സൈദ്ധാന്തിക കൊളീഷൻ ആക്രമണങ്ങൾ HMAC നിർമ്മിതിയെ (RFC 2104) ബാധിക്കില്ല. HMAC-ൽ അടിസ്ഥാന ഹാഷ് ഫംഗ്ഷൻ ആന്തരികവും ബാഹ്യവുമായ രഹസ്യ കീകൾക്കുള്ളിൽ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നു, ഇത് കൊളീഷൻ അടിസ്ഥാനമാക്കിയുള്ള ആക്രമണങ്ങളെ പൂർണ്ണമായി തടയുന്നു. ഇന്നുവരെ, 2FA ആവശ്യങ്ങൾക്കായി HMAC-SHA1 പൂർണ്ണമായും സുരക്ഷിതമാണ്. മാത്രമല്ല, ഉയർന്ന സുരക്ഷ ആവശ്യമെങ്കിൽ HMAC-SHA256, HMAC-SHA512 എന്നിവയെയും RFC 6238 പൂർണ്ണമായി പിന്തുണയ്ക്കുന്നു.
ചോദ്യം 2: സമയമേഖലകളോ (Time Zones) ഡേലൈറ്റ് സേവിംഗ് ടൈമോ (DST) TOTP സിൻക്രൊണൈസേഷനെ ബാധിക്കുമോ? ▼
ഇല്ല. Unix എപ്പോക്ക് സമയം എന്നത് 1970-01-01 00:00:00 UTC മുതൽ കഴിഞ്ഞ സെക്കൻഡുകളാണ്. ഇതിന് സമയമേഖലകളുമായോ ഡേലൈറ്റ് സേവിംഗ് വ്യത്യാസങ്ങളുമായോ യാതൊരു ബന്ധവുമില്ല. ഏത് നിമിഷത്തിലും, ടോക്കിയോയിലുള്ള ഒരു സെർവറിലും കാലിഫോർണിയയിലുള്ള ഒരു സ്മാർട്ട്ഫോണിലും ഒരേ ടൈംസ്റ്റാമ്പ് തന്നെയായിരിക്കും.
ചോദ്യം 3: Steam Guard-ന്റെ 5-അക്ഷര ഓതന്റിക്കേഷൻ RFC 6238-ൽ നിന്ന് എങ്ങനെ വ്യത്യാസപ്പെട്ടിരിക്കുന്നു? ▼
Steam Guard എന്നത് RFC 6238-നെ അടിസ്ഥാനമാക്കിയുള്ള വാൽവിന്റെ പ്രൊപ്രൈറ്ററി പതിപ്പാണ്. ഇത് അതേ 30-സെക്കൻഡ് ടൈം-സ്റ്റെപ്പും HMAC-SHA1 കണക്കുകൂട്ടലും ഉപയോഗിക്കുന്നു, എന്നാൽ അവസാന ഘട്ടത്തിൽ ലഭിക്കുന്ന സംഖ്യയെ പ്രത്യേക 26-അക്ഷര ആൽഫാന്യൂമെറിക് അറേയുമായി (23456789BCDFGHJKMNPQRTVWXY) മാപ്പ് ചെയ്ത് 5-അക്ഷര കോഡ് നിർമ്മിക്കുന്നു.
100% ക്ലയന്റ്-സൈഡ് TOTP കോഡ് ജനറേഷൻ തത്സമയം പരീക്ഷിക്കുക
W3C Web Crypto API ഉപയോഗിച്ച് നിങ്ങളുടെ ബ്രൗസറിനുള്ളിൽ തന്നെ 2FA-Tool ഈ ക്രിപ്റ്റോഗ്രാഫിക് പൈപ്പ്ലൈൻ പൂർണ്ണമായി പ്രവർത്തിപ്പിക്കുന്നു. സെർവറിലേക്ക് ഡാറ്റ അയയ്ക്കുന്നില്ല, ടോക്കണുകൾ സംഭരിക്കുന്നില്ല, തൽക്ഷണ പരിശോധന സാധ്യമാക്കുന്നു.