TopDev

Thuật toán OCRA trong việc tạo mã OTP xác thực cho hệ thống

minhdev 📖 3 phút đọc

Thuật toán OCRA (OATH Challenge-Response Algorithm) là một phần của tiêu chuẩn OATH, được thiết kế để tạo mã OTP dựa trên một thử thách (challenge) và một số yếu tố khác như thời gian, khóa bí mật (shared secret), và số lần đồng bộ.

Để áp dụng thuật toán OCRA trong việc tạo mã OTP xác thực cho hệ thống, bạn có thể thực hiện các bước sau:



1. Hiểu cấu trúc của OCRA#

OCRA được định nghĩa bởi một chuỗi định dạng xác định cách thức mã OTP được tính toán. Chuỗi này có dạng: OCRA-<CryptoFunction>-<DataInput>

  • CryptoFunction: Hàm băm được sử dụng, ví dụ SHA1, SHA256, SHA512.

  • DataInput: Các thông số đầu vào cho thuật toán, bao gồm: C: Counter (đếm số lần sử dụng, tùy chọn).

    • Q: Challenge (chuỗi thử thách).

    • P: PIN (tùy chọn).

    • T: Timestamp (thời gian, tùy chọn).

    • S: Session information (thông tin phiên, tùy chọn).

Ví dụ cấu trúc: OCRA-1:HOTP-SHA1-6:QN08.



2. Yêu cầu chính#

  • Shared Secret (k): Một khóa bí mật được chia sẻ giữa server và client.

  • Challenge (Q): Một chuỗi thử thách có thể là số ngẫu nhiên, câu hỏi hoặc bất kỳ chuỗi nào.

  • PIN hoặc Timestamp (tùy chọn): Để tăng tính bảo mật.



3. Cách hoạt động#

  • OCRA sử dụng HMAC để tính toán mã OTP dựa trên công thức: [ HMAC(k, DataInput) ]

  • Trong đó, DataInput được kết hợp từ các thông số như Counter, Challenge, PIN, và Timestamp.



4. Cài đặt thuật toán OCRA trong Java#

Sử dụng thư viện mã hóa như javax.crypto hoặc các thư viện bên thứ ba như BouncyCastle để triển khai. Ví dụ:

` import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets;

public class OCRA { public static String generateOCRA(String ocraSuite, String key, String challenge) throws Exception { // Chuyển khóa bí mật từ dạng chuỗi sang byte byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);

    // Khởi tạo thuật toán HMAC với hàm băm (SHA1, SHA256, SHA512)
    Mac hmac = Mac.getInstance("HmacSHA1");
    SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "HmacSHA1");
    hmac.init(keySpec);

    // Tạo đầu vào từ chuỗi thử thách
    byte[] challengeBytes = challenge.getBytes(StandardCharsets.UTF_8);

    // Tính toán HMAC
    byte[] hmacResult = hmac.doFinal(challengeBytes);

    // Chuyển kết quả HMAC sang mã OTP (6 chữ số)
    int offset = hmacResult[hmacResult.length - 1] & 0xF;
    int binary =
            ((hmacResult[offset] & 0x7F) << 24)
                    | ((hmacResult[offset + 1] & 0xFF) << 16)
                    | ((hmacResult[offset + 2] & 0xFF) << 8)
                    | (hmacResult[offset + 3] & 0xFF);

    int otp = binary % 1_000_000;
    return String.format("%06d", otp);
}

public static void main(String[] args) throws Exception {
    String ocraSuite = "OCRA-1:HOTP-SHA1-6:QN08";
    String key = "sharedSecret";
    String challenge = "12345678";

    String otp = generateOCRA(ocraSuite, key, challenge);
    System.out.println("Generated OTP: " + otp);
}

} `



5. Triển khai vào hệ thống#

  • Server: Lưu trữ khóa bí mật và kiểm tra mã OTP từ client.

  • Client: Sinh mã OTP dựa trên thuật toán OCRA với khóa bí mật và chuỗi thử thách.

  • Giao thức đồng bộ: Đảm bảo client và server sử dụng cùng một ocraSuitekey.



6. Bảo mật#

  • Khóa bí mật (Shared Secret) cần được bảo mật nghiêm ngặt.

  • Challenge nên là một chuỗi ngẫu nhiên hoặc liên quan đến thông tin giao dịch.

  • Sử dụng HTTPS để truyền dữ liệu giữa client và server.

Nếu cần thêm hỗ trợ, hãy cho tôi biết! 😊

Bài liên quan trong #Tin tức

✓ Đã sao chép link