நவீன வலைப் பாதுகாப்பில் அடிப்படை கிரிப்டோகிராஃபிக் நெறிமுறைகளில் RFC 6238 (TOTP: Time-Based One-Time Password Algorithm) அதன் கணித எளிமையால் தனித்து நிற்கிறது. இதற்கு ஊடாடும் பிணைய கைகுலுக்கல்கள், மையப்படுத்தப்பட்ட பொது விசை உள்கட்டமைப்பு (PKI) அல்லது கிளவுட் அழைப்புகள் எதுவும் தேவையில்லை. பகிரப்பட்ட Base32 ரகசிய விசை மற்றும் இயற்பியல் Unix நேரத்தின் நிலையான முன்னோக்கு நகர்வு ஆகியவற்றை மட்டுமே கொண்டு, கிளையண்ட்டும் சர்வரும் ஒவ்வொரு 30 வினாடிகளுக்கும் ஒரே மாதிரியான, தற்காலிக 6-இலக்க அங்கீகார டோக்கன்களை 100% கணித துல்லியத்துடன் கணக்கிடுகின்றன.
இந்த விரிவான வழிகாட்டியில், பிளாக்-பாக்ஸ் மூன்றாம் தரப்பு நூலகங்களைத் தவிர்த்து (உதாரணமாக 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 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-பைட் big-endian 64-பிட் கையொப்பமிடப்படாத முழு எண்ணாக குறியாக்கம் செய்யப்படுகிறது.
மூல விசை பைட்டுகள் $K$-ஐ ரகசிய விசையாகப் பயன்படுத்தி, 8-பைட் big-endian நேர இடையகத்தின் மீது 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: """ RFC 6238-க்கு இணக்கமான TOTP டோக்கனை உருவாக்குகிறது. :param secret_base32: Base32 வடிவத்தில் பகிரப்பட்ட ரகசிய விசை (எ.கா: ‘JBSWY3DPEHPK3PXP’) :param timestamp: வினாடிகளில் Unix epoch நேரமுத்திரை. முன்னிருப்பு time.time() :param step: நேர சாளரம் வினாடிகளில் (முன்னிருப்பு: 30) :param digits: வெளியீட்டு இலக்கங்களின் எண்ணிக்கை (முன்னிருப்பு: 6) :return: பூஜ்ஜியம் நிரப்பப்பட்ட OTP சரம் (எ.கா: ‘045812’) """ if timestamp is None: timestamp = int(time.time())
# 1. Base32 சரத்தை இயல்பாக்கி '=' பேடிங் எழுத்துக்களைச் சேர்க்கவும் 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. 64-பிட் big-endian நேர-படி கவுண்டர் T-ஐக் கணக்கிடவும் time_counter = timestamp // step time_bytes = struct.pack(">Q", time_counter) # 8 bytes big-endian unsigned long long # 3. HMAC-SHA1 டைஜெஸ்ட்டைக் கணக்கிடவும் (20 பைட்டுகள்) hmac_digest = hmac.new(key_bytes, time_bytes, hashlib.sha1).digest() # 4. டைனமிக் ட்ரங்க்கேஷன் செயல்படுத்தவும் offset = hmac_digest[-1] & 0x0F # 20வது பைட்டின் கீழ் 4 பிட்கள் # ஆஃப்செட்டில் உள்ள 4 பைட்டுகளை அன்-பேக் செய்து MSB சைன் பிட்டை நீக்கவும் binary_code = struct.unpack(">I", hmac_digest[offset : offset + 4])[0] & 0x7FFFFFFF # 5. மாடுலோ கணக்கீடு மற்றும் பூஜ்ஜிய நிரப்புதல் வடிவமைப்பு otp_code = binary_code % (10 ** digits) return str(otp_code).zfill(digits)
if name == “main”: test_secret = “JBSWY3DPEHPK3PXP” print(f”உருவாக்கப்பட்ட TOTP குறியீடு: {generate_totp(test_secret)}”)
04. இயங்கக்கூடிய குறியீடு 2: JavaScript & Node.js Crypto
Node.js சர்வர் சூழல்களுக்கான தூய JavaScript செயல்படுத்தல், சொந்த crypto.createHmac-ஐப் பயன்படுத்துகிறது:
const crypto = require('crypto');// தூய JavaScript-ல் RFC 4648 Base32 டிகோடர் 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);
// Big-Endian வடிவத்தில் 8-பைட் இடையகத்தை ஒதுக்கவும் const buffer = Buffer.alloc(8); buffer.writeBigUInt64BE(BigInt(counter), 0);
// HMAC-SHA1 கணக்கீடு const hmac = crypto.createHmac(‘sha1’, key).update(buffer).digest();
// டைனமிக் ட்ரங்க்கேஷன் 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(“கணக்கிடப்பட்ட 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. மூல ரகசிய விசையை SubtleCrypto-வில் இறக்குமதி செய்யவும் const cryptoKey = await window.crypto.subtle.importKey( “raw”, keyBytes, { name: “HMAC”, hash: { name: “SHA-1” } }, false, [“sign”] );
// 2. 8-பைட் Big-Endian கவுண்டர் இடையகத்தை குறியாக்கம் செய்யவும் const buffer = new ArrayBuffer(8); const view = new DataView(buffer); view.setBigUint64(0, BigInt(counter), false); // false = Big-Endian
// 3. கிரிப்டோகிராஃபிக் HMAC கையொப்பமிடுதல் const signature = await window.crypto.subtle.sign(“HMAC”, cryptoKey, buffer); const hmacResult = new Uint8Array(signature);
// 4. டைனமிக் ட்ரங்க்கேஷன் 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 நிலையான RFC 6238 நேர அடிப்படையிலான டோக்கன்களைக் கணக்கிடுகிறது func GenerateTOTP(secretBase32 string, timestamp int64, step int64, digits int) (string, error) { // 1. Base32 விதையைச் சுத்தப்படுத்தி டிகோட் செய்யவும் 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. 64-பிட் Big-Endian நேர-படி கவுண்டரை குறியாக்கம் செய்யவும் counter := uint64(timestamp / step) buf := make([]byte, 8) binary.BigEndian.PutUint64(buf, counter) // 3. HMAC-SHA1 கணக்கீடு mac := hmac.New(sha1.New, key) mac.Write(buf) hash := mac.Sum(nil) // 4. டைனமிக் ட்ரங்க்கேஷன் offset := hash[len(hash)-1] & 0x0f binaryCode := binary.BigEndian.Uint32(hash[offset:offset+4]) & 0x7fffffff // 5. மாடுலோ கணக்கீடு 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 கணக்கிட்ட 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 வினாடிகள் விரிவுபடுத்துகிறது.
ஒரு டோக்கன் வெற்றிகரமாகப் பயன்படுத்தப்பட்டவுடன் உடனடியாக செல்லாததாக்கப்பட வேண்டும். 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 மீதான கோட்பாட்டு மோதல் தாக்குதல்கள் HMAC அமைப்பை (RFC 2104) பாதிக்காது. HMAC முறையில், அடிப்படை ஹாஷ் செயல்பாடு உள் மற்றும் வெளிப்புற ரகசிய விசைகளுக்குள் பொதிந்துள்ளது, இது மோதல் அடிப்படையிலான தாக்குதல்களை நடுநிலையாக்குகிறது. இன்றுவரை, 2FA-வுக்கு HMAC-SHA1 பாதுகாப்பானது. மேலும், கூடுதல் பாதுகாப்பு தேவைப்பட்டால் RFC 6238 முழுமையாக HMAC-SHA256 மற்றும் HMAC-SHA512-ஐ ஆதரிக்கிறது.
கே2: நேர மண்டலங்கள் அல்லது பகல் சேமிப்பு நேரம் (DST) TOTP ஒத்திசைவைப் பாதிக்குமா? ▼
இல்லை. Unix epoch நேரம் என்பது 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 குறியீடு உருவாக்கத்தை அனுபவிக்கவும்
2FA-Tool இந்த துல்லியமான கிரிப்டோகிராஃபிக் பைப்லைனை உங்கள் உலாவியிலேயே நேரடியாக W3C Web Crypto API மூலம் செயல்படுத்துகிறது. பூஜ்ஜிய சர்வர் பரிமாற்றம், பூஜ்ஜிய டோக்கன் சேமிப்பு, உடனடி சரிபார்ப்பு.