Kiểm thử
Hai cách để tạo mã SmartOTP mà không cần SDK: một ứng dụng authenticator tiêu chuẩn cho OTP cơ bản, và một script Python bao phủ cả mã cơ bản lẫn nâng cao.
OTP cơ bản với Google Authenticator
Đăng ký một Soft OTP mới và ghi lại key từ response của Kích hoạt:
{
"success": true,
"code": 1,
"message": "success",
"data": {
"key": "fake_client_secret_key",
"period": 15,
"algorithm": "HmacSHA512",
"length": 6,
"type": "totp",
"issuer": "SOTP"
}
}Tạo mã QR ngay trên máy — ví dụ pyotp.TOTP(...).provisioning_uri() chuyển cho qrencode — với các giá trị sau:
| Trường | Kiểu | Mô tả |
|---|---|---|
| Type | TOTP | Dựa trên thời gian (time-based). |
| Secret | fake_client_secret_key | key từ response, đã bỏ ký tự = ở cuối. |
| Label | Cake-Soft-OTP | Nhãn hiển thị. |
| Issuer | Cake | Issuer hiển thị. |
| Algorithm | SHA-512 | Phải khớp với HmacSHA512. |
| Length | 6 digits | Độ dài mã. |
| Period | 15 | Số giây mỗi mã. |
Ký tự = ở cuối là phần đệm (padding) Base32. Các ứng dụng authenticator sẽ từ chối secret trừ khi bạn loại bỏ nó.
WARNING
Cách này đưa một client secret đang hoạt động vào một ứng dụng authenticator dành cho người tiêu dùng. Chỉ dùng nó với thông tin xác thực test trên một tenant không phải production — không bao giờ dùng với secret thật của khách hàng.
Cả hai loại OTP với Python
pip install pyotp
# or
pip3 install pyotpThay client_secret bằng key từ Kích hoạt, và challenge bằng challenge_key từ Tạo giao dịch:
import pyotp
import hashlib
import base64
client_secret = "fake_client_secret_key"
challenge = "fake_challenge_key"
def gen_opt(secret) -> str:
totp = pyotp.TOTP(secret, 6, hashlib.sha512, "CAKE", "CAKE", 15)
return totp.now()
def gen_secret_from_challenge(secret, challenge) -> str:
src = secret + "-" + challenge
m = hashlib.sha512()
m.update(bytes(src, 'utf-8'))
return base64.b32encode(m.digest())
otp = gen_opt(client_secret)
print("Basic OTP: ", otp)
secret = gen_secret_from_challenge(client_secret, challenge)
advance_otp = gen_opt(secret)
print("Advance OTP: ", advance_otp)python otp.py
# or
python3 otp.pyBasic OTP: 123456
Advance OTP: 654321Secret dùng cho OTP nâng cao được suy ra bằng cách nối khóa bí mật của client và khóa challenge bằng dấu -, băm bằng SHA-512, rồi mã hóa Base32 digest thu được. Giá trị suy ra đó sau đó được dùng như một secret TOTP thông thường.
Bước tiếp theo
- Xác minh OTP — xác minh các mã bạn tạo ở đây
- Tổng quan SmartOTP — sự khác nhau giữa mã cơ bản và nâng cao