ಆಧುನಿಕ ವೆಬ್ ಭದ್ರತೆಯಲ್ಲಿನ ಮೂಲಭೂತ ಕ್ರಿಪ್ಟೋಗ್ರಾಫಿಕ್ ಪ್ರೋಟೋಕಾಲ್ಗಳಲ್ಲಿ, RFC 6238 (TOTP: ಸಮಯ-ಆಧಾರಿತ ಏಕ-ಬಳಕೆಯ ಪಾಸ್ವರ್ಡ್ ಅಲ್ಗಾರಿದಮ್) ತನ್ನ ಗಣಿತದ ಸರಳತೆಯಿಂದ ಎದ್ದು ಕಾಣುತ್ತದೆ. ಇದಕ್ಕೆ ಯಾವುದೇ ಸಂವಾದಾತ್ಮಕ ನೆಟ್ವರ್ಕ್ ಹ್ಯಾಂಡ್ಶೇಕ್ಗಳು, ಕೇಂದ್ರೀಕೃತ ಸಾರ್ವಜನಿಕ ಕೀ ಮೂಲಸೌಕರ್ಯ (PKI) ಅಥವಾ ಕ್ಲೌಡ್ ಸಂವಹನಗಳ ಅಗತ್ಯವಿಲ್ಲ. ಕೇವಲ ಒಂದು ಹಂಚಿಕೊಂಡ Base32 ರಹಸ್ಯ ಕೀ ಮತ್ತು ಭೌತಿಕ Unix ಸಮಯದ ನಿರಂತರ ಮುನ್ನಡೆಯೊಂದಿಗೆ, ಕ್ಲೈಂಟ್ ಮತ್ತು ಸರ್ವರ್ ಪ್ರತಿ 30 ಸೆಕೆಂಡಿಗೆ 100% ಗಣಿತದ ನಿಖರತೆಯೊಂದಿಗೆ ಒಂದೇ ರೀತಿಯ 6-ಅಂಕಿಯ ಅಸ್ಥಿರ ದೃಢೀಕರಣ ಟೋಕನ್ಗಳನ್ನು ಲೆಕ್ಕಾಚಾರ ಮಾಡುತ್ತವೆ.
ಈ ಸಮಗ್ರ ಮಾರ್ಗದರ್ಶಿಯಲ್ಲಿ, ನಾವು ಮೂರನೇ ವ್ಯಕ್ತಿಯ ಬ್ಲ್ಯಾಕ್-ಬಾಕ್ಸ್ ಲೈಬ್ರರಿಗಳನ್ನು (ಉದಾಹರಣೆಗೆ pyotp ಅಥವಾ otplib) ಬಳಸದೆ, Python, JavaScript ಮತ್ತು Go ಭಾಷೆಗಳಲ್ಲಿ ಮೊದಲಿನಿಂದಲೇ ಸಂಪೂರ್ಣ RFC 6238 ಕ್ರಿಪ್ಟೋಗ್ರಾಫಿಕ್ ಪೈಪ್ಲೈನ್ ಅನ್ನು ನಿರ್ಮಿಸುತ್ತೇವೆ ಮತ್ತು ಪ್ರತಿಯೊಂದು ಕೋಡ್ ಅನುಷ್ಠಾನವನ್ನು ಅಧಿಕೃತ IETF ಟೆಸ್ಟ್ ವೆಕ್ಟರ್ಗಳ ವಿರುದ್ಧ ಪರಿಶೀಲಿಸುತ್ತೇವೆ.
01. ಸಮಯ-ಆಧಾರಿತ ದೃಢೀಕರಣದ ಸೊಬಗು
TOTP ಅನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು, ನಾವು ಮೊದಲು ಅದರ ಹಿಂದಿನ ಆವೃತ್ತಿಯನ್ನು ತಿಳಿಯಬೇಕು: RFC 4226 HOTP (HMAC-ಆಧಾರಿತ ಏಕ-ಬಳಕೆಯ ಪಾಸ್ವರ್ಡ್).
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 epoch ಸಮಯವನ್ನು ಬಳಸುವ ಮೂಲಕ ಕೌಂಟರ್ ಡಿಸಿಂಕ್ ಸಮಸ್ಯೆಯನ್ನು ಪರಿಹರಿಸಿತು. ಭೌತಿಕ ಸಮಯವು ಜಗತ್ತಿನಾದ್ಯಂತ ಏಕರೂಪವಾಗಿ ಮುನ್ನಡೆಯುವುದರಿಂದ, ಕ್ಲೈಂಟ್ ಮತ್ತು ಸರ್ವರ್ ಎರಡೂ ಯಾವುದೇ ನೆಟ್ವರ್ಕ್ ಪ್ಯಾಕೆಟ್ ಕಳುಹಿಸದೆಯೇ ತಮ್ಮ ಆಂತರಿಕ ಕೌಂಟರ್ಗಳನ್ನು ಏಕಕಾಲದಲ್ಲಿ ಮುನ್ನಡೆಸುತ್ತವೆ.
02. TOTP ಯ 5 ಕ್ರಿಪ್ಟೋಗ್ರಾಫಿಕ್ ಗಣಿತ ಹಂತಗಳು
16-ಅಕ್ಷರಗಳ Base32 ಸೀಡ್ ಅನ್ನು (ಉದಾ., JBSWY3DPEHPK3PXP) 6-ಅಂಕಿಯ ಬದಲಾಗುವ ಕೋಡ್ ಆಗಿ (ಉದಾ., 284915) ಪರಿವರ್ತಿಸುವುದು ಐದು ನಿಖರವಾದ ಕ್ರಿಪ್ಟೋಗ್ರಾಫಿಕ್ ಹಂತಗಳನ್ನು ಒಳಗೊಂಡಿದೆ:
ಎಕ್ಸ್ಚೇಂಜ್ ಎನ್ರೋಲ್ಮೆಂಟ್ ಕೀಗಳನ್ನು RFC 4648 Base32 ನಲ್ಲಿ A-Z ಮತ್ತು 2-7 ವರ್ಣಮಾಲೆಯನ್ನು ಬಳಸಿ ಎನ್ಕೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ (ಗೊಂದಲ ಮೂಡಿಸುವ 0, 1, 8, 9 ನಂತಹ ಅಕ್ಷರಗಳನ್ನು ಬಿಟ್ಟುಬಿಡಲಾಗುತ್ತದೆ). ಅಲ್ಗಾರಿದಮ್ ಮೊದಲು ಈ ಸ್ಟ್ರಿಂಗ್ ಅನ್ನು ಸಾಮಾನ್ಯೀಕರಿಸುತ್ತದೆ, ಸ್ಪೇಸ್ಗಳನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ ಮತ್ತು ಉದ್ದವು 8 ರ ಗುಣಕವಾಗುವಂತೆ ಪ್ಯಾಡಿಂಗ್ (=) ಅನ್ವಯಿಸುತ್ತದೆ, ನಂತರ ಅದನ್ನು ಕಚ್ಚಾ ಬೈನರಿ ಕೀ ಬೈಟ್ಗಳು $K$ ಗೆ ಡಿಕೋಡ್ ಮಾಡುತ್ತದೆ.
ಪ್ರಸ್ತುತ Unix ಟೈಮ್ಸ್ಟ್ಯಾಂಪ್ ಅನ್ನು (ಜನವರಿ 1, 1970 UTC ಯಿಂದ ಕಳೆದ ಸೆಕೆಂಡುಗಳು) ಪೂರ್ಣಾಂಕ ಕೌಂಟರ್ $T$ ಗೆ ಮ್ಯಾಪ್ ಮಾಡಲಾಗುತ್ತದೆ:
ಪ್ರಮಾಣಿತ ನಿಯತಾಂಕಗಳಾದ $T_0 = 0$ ಮತ್ತು ಹಂತದ ಅವಧಿ $X = 30$ ಸೆಕೆಂಡುಗಳೊಂದಿಗೆ. ಈ ಪೂರ್ಣಾಂಕ $T$ ಅನ್ನು ನಂತರ 8-ಬೈಟ್ ಬಿಗ್-ಎಂಡಿಯನ್ 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-ಅಕ್ಷರಗಳ ಔಟ್ಪುಟ್ ಸ್ಟ್ರಿಂಗ್ ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಫಲಿತಾಂಶವನ್ನು ಶೂನ್ಯಗಳೊಂದಿಗೆ ಎಡಭಾಗದಲ್ಲಿ ಪ್ಯಾಡ್ ಮಾಡಿ:
03. ಚಲಾಯಿಸಬಹುದಾದ ಕೋಡ್ 1: Python 3 ಸ್ಟ್ಯಾಂಡರ್ಡ್ ಲೈಬ್ರರಿ
ಈ ಸಂಪೂರ್ಣ ಅನುಷ್ಠಾನವು ಯಾವುದೇ ಬಾಹ್ಯ pip ಪ್ಯಾಕೇಜ್ಗಳ ಅಗತ್ಯವಿಲ್ಲದೆ Python ನ ಅಂತರ್ನಿರ್ಮಿತ base64, struct, hmac ಮತ್ತು hashlib ಮಾಡ್ಯೂಲ್ಗಳನ್ನು ಬಳಸುತ್ತದೆ:
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 ಅನ್ನು ನಡೆಸುತ್ತಿರುವ ಅದೇ ನಿಖರವಾದ ಆರ್ಕಿಟೆಕ್ಚರ್), W3C Web Crypto API ಯಾವುದೇ ಮೂರನೇ ವ್ಯಕ್ತಿಯ npm ಬಂಡಲ್ಗಳಿಲ್ಲದೆ ನೇರವಾಗಿ ಬ್ರೌಸರ್ ಸ್ಯಾಂಡ್ಬಾಕ್ಸ್ನಲ್ಲಿ ಅಸಮಕಾಲಿಕ, ಹಾರ್ಡ್ವೇರ್-ವೇಗವರ್ಧಿತ ಕ್ರಿಪ್ಟೋಗ್ರಾಫಿಕ್ ಪ್ರಿಮಿಟಿವ್ಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ:
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 ನಲ್ಲಿ ಪ್ರಕಟಿಸಲಾದ ಅಧಿಕೃತ ಟೆಸ್ಟ್ ವೆಕ್ಟರ್ಗಳ ವಿರುದ್ಧ ಪರಿಶೀಲಿಸಬೇಕು.
ಅಧಿಕೃತ ಪರೀಕ್ಷಾ ಸೂಟ್ ASCII ರಹಸ್ಯ "12345678901234567890" (20 ಬೈಟ್ಗಳು) ಅನ್ನು ಬಳಸುತ್ತದೆ, ಇದು 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 ಸೆಕೆಂಡುಗಳವರೆಗೆ ಹೆಚ್ಚಿಸುತ್ತದೆ.
ಯಶಸ್ವಿ ಪರಿಶೀಲನೆಯ ನಂತರ ಟೋಕನ್ ಅನ್ನು ತಕ್ಷಣವೇ ಅಮಾನ್ಯಗೊಳಿಸಬೇಕು. Last_Verified_Time_Step ಅನ್ನು Redis ಅಥವಾ ಇನ್-ಮೆಮೊರಿ ಕ್ಯಾಶ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಿ. ಕ್ಲೈಂಟ್ ಅದೇ 30-ಸೆಕೆಂಡ್ ವಿಂಡೋದಲ್ಲಿ ಅದೇ ಟೋಕನ್ ಅನ್ನು ಮತ್ತೆ ಸಲ್ಲಿಸಲು ಪ್ರಯತ್ನಿಸಿದರೆ, ಮ್ಯಾನ್-ಇನ್-ದಿ-ಮಿಡಲ್ ಮರುಪ್ಲೇ ದಾಳಿಗಳನ್ನು ತಡೆಯಲು ವಿನಂತಿಯನ್ನು ತಿರಸ್ಕರಿಸಿ.
6-ಅಂಕಿಯ ಕೋಡ್ಗಳು ಕೇವಲ 1,000,000 ಸಂಯೋಜನೆಗಳನ್ನು ಹೊಂದಿರುವುದರಿಂದ, ದರ ಮಿತಿಯಿಲ್ಲದ ಎಂಡ್ಪಾಯಿಂಟ್ಗಳನ್ನು ವೇಗವಾಗಿ ಬ್ರೂಟ್-ಫೋರ್ಸ್ ಮಾಡಬಹುದು. ಸತತ 3 ವಿಫಲ ಪ್ರಯತ್ನಗಳ ನಂತರ ಪ್ರಗತಿಪರ ವಿಳಂಬಗಳು ಮತ್ತು ಖಾತೆ ಲಾಕ್ಔಟ್ಗಳನ್ನು ಜಾರಿಗೊಳಿಸಿ. ಕೋಡ್ನಲ್ಲಿ, ಸೈಡ್-ಚಾನೆಲ್ ಟೈಮಿಂಗ್ ದಾಳಿಗಳನ್ನು ತಡೆಯಲು ಸ್ಥಿರ-ಸಮಯದ ಸಮಾನತೆಯ ಕಾರ್ಯಗಳನ್ನು (ಉದಾ., Go ನಲ್ಲಿ crypto/subtle.ConstantTimeCompare ಅಥವಾ Node.js ನಲ್ಲಿ crypto.timingSafeEqual) ಬಳಸಿ ಹೋಲಿಕೆಗಳನ್ನು ಮಾಡಿ.
08. ಪದೇ ಪದೇ ಕೇಳಲಾಗುವ ಪ್ರಶ್ನೆಗಳು (FAQ)
ಪ್ರ1: SHA-1 ಕ್ರಿಪ್ಟೋಗ್ರಾಫಿಕ್ ಆಗಿ ಮುರಿದುಬಿದ್ದಿರುವುದರಿಂದ, TOTP ಇನ್ನೂ HMAC-SHA1 ಅನ್ನು ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ ಏಕೆ ಬಳಸುತ್ತದೆ? ▼
ಕಚ್ಚಾ SHA-1 ವಿರುದ್ಧದ ಸೈದ್ಧಾಂತಿಕ ಘರ್ಷಣೆ (collision) ದಾಳಿಗಳು HMAC ರಚನೆಯನ್ನು (RFC 2104) ಮುರಿಯುವುದಿಲ್ಲ. HMAC ನಲ್ಲಿ, ಆಂತರಿಕ ಹ್ಯಾಶ್ ಕಾರ್ಯವು ಆಂತರಿಕ ಮತ್ತು ಬಾಹ್ಯ ರಹಸ್ಯ ಕೀಗಳಲ್ಲಿ ಅಡಕವಾಗಿರುತ್ತದೆ, ಇದು ಘರ್ಷಣೆ-ಆಧಾರಿತ ದಾಳಿಗಳನ್ನು ತಟಸ್ಥಗೊಳಿಸುತ್ತದೆ. ಇಂದಿಗೂ, 2FA ಗಾಗಿ HMAC-SHA1 ಸುರಕ್ಷಿತವಾಗಿದೆ. ಹೆಚ್ಚುವರಿಯಾಗಿ, ಹೆಚ್ಚಿನ ಭದ್ರತೆಯ ಅಗತ್ಯವಿದ್ದರೆ RFC 6238 HMAC-SHA256 ಮತ್ತು HMAC-SHA512 ಅನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ಬೆಂಬಲಿಸುತ್ತದೆ.
ಪ್ರ2: ಸಮಯ ವಲಯಗಳು (Time Zones) ಅಥವಾ ಹಗಲು ಉಳಿತಾಯ ಸಮಯ (DST) TOTP ಸಿಂಕ್ರೊನೈಸೇಶನ್ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತವೆಯೇ? ▼
ಇಲ್ಲ. Unix epoch ಸಮಯವನ್ನು 1970-01-01 00:00:00 UTC ಯಿಂದ ಕಳೆದ ಸೆಕೆಂಡುಗಳು ಎಂದು ವ್ಯಾಖ್ಯಾನಿಸಲಾಗಿದೆ. ಇದು ಸಮಯ ವಲಯಗಳು, ಲೀಪ್ ಸೆಕೆಂಡುಗಳು ಮತ್ತು ಡೇಲೈಟ್ ಸೇವಿಂಗ್ ಶಿಫ್ಟ್ಗಳಿಂದ ಕಟ್ಟುನಿಟ್ಟಾಗಿ ಸ್ವತಂತ್ರವಾಗಿದೆ. ಯಾವುದೇ ನಿಖರವಾದ ಕ್ಷಣದಲ್ಲಿ, ಟೋಕಿಯೊದಲ್ಲಿನ ಸರ್ವರ್ ಮತ್ತು ಕ್ಯಾಲಿಫೋರ್ನಿಯಾದಲ್ಲಿನ ಸ್ಮಾರ್ಟ್ಫೋನ್ ಎರಡೂ ನಿಖರವಾಗಿ ಒಂದೇ ಪೂರ್ಣಾಂಕದ ಟೈಮ್ಸ್ಟ್ಯಾಂಪ್ ಅನ್ನು ಹೊಂದಿರುತ್ತವೆ.
ಪ್ರ3: Steam Guard 5-ಅಕ್ಷರದ ದೃಢೀಕರಣವು RFC 6238 ನಿಂದ ಹೇಗೆ ಭಿನ್ನವಾಗಿದೆ? ▼
Steam Guard ಎಂಬುದು RFC 6238 ಆಧಾರಿತ ಸ್ವಾಮ್ಯದ (proprietary) ರೂಪಾಂತರವಾಗಿದೆ. ಇದು ನಿಖರವಾಗಿ ಅದೇ 30-ಸೆಕೆಂಡ್ ಸಮಯ-ಹಂತ ಮತ್ತು HMAC-SHA1 ಲೆಕ್ಕಾಚಾರವನ್ನು ಬಳಸುತ್ತದೆ, ಆದರೆ ಅಂತಿಮ ಕಡಿತ ಹಂತದಲ್ಲಿ, ಇದು ಹೊರತೆಗೆಯಲಾದ ಪೂರ್ಣಾಂಕವನ್ನು ಕಸ್ಟಮ್ 26-ಅಕ್ಷರಗಳ ಆಲ್ಫಾನ್ಯೂಮರಿಕ್ ಅರೇಗೆ (23456789BCDFGHJKMNPQRTVWXY) ಮ್ಯಾಪ್ ಮಾಡಿ 5-ಅಕ್ಷರಗಳ ಸ್ಟ್ರಿಂಗ್ ಅನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ.
100% ಕ್ಲೈಂಟ್-ಸೈಡ್ TOTP ಕೋಡ್ ಜನರೇಟರ್ ಅನ್ನು ಲೈವ್ ಆಗಿ ಅನುಭವಿಸಿ
2FA-Tool ಈ ನಿಖರವಾದ ಕ್ರಿಪ್ಟೋಗ್ರಾಫಿಕ್ ಪೈಪ್ಲೈನ್ ಅನ್ನು W3C Web Crypto API ಬಳಸಿ ನೇರವಾಗಿ ನಿಮ್ಮ ಬ್ರೌಸರ್ನಲ್ಲಿ ಕಾರ್ಯಗತಗೊಳಿಸುತ್ತದೆ. ಸರ್ವರ್ ಪ್ರಸರಣ ಶೂನ್ಯ, ಟೋಕನ್ ಸಂಗ್ರಹಣೆ ಶೂನ್ಯ, ತತ್ಕ್ಷಣದ ಪರಿಶೀಲನೆ.