Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [An toàn thông tin] Xác thực đa yếu tố: mật khẩu băm muối và TOTP có cửa sổ lệch giờ

    Hệ thống xác thực đa yếu tố (MFA) gồm 2 bước kiểm tra tuần tự:

    Bước 1 — mật khẩu: mật khẩu thử ppp (chuỗi, có thể rỗng) được coi là hợp lệ khi

    SHA-256(salt∥p)=H\text{SHA-256}(\text{salt} \parallel p) = HSHA-256(salt∥p)=H

    trong đó salt\text{salt}salt là chuỗi byte giải mã từ hex, ppp được mã hoá UTF-8, phép ∥\parallel∥ là nối byte, và HHH (hex) là giá trị băm lưu sẵn. Nếu mật khẩu sai, quá trình dừng lại ngay, không kiểm tra OTP.

    Bước 2 — TOTP có cho phép lệch giờ: nếu mật khẩu đúng, hệ thống kiểm tra mã TOTP (RFC 6238, dùng HMAC-SHA1, 6 chữ số, bước thời gian X=30X=30X=30 giây, mốc T0=0T_0=0T0​=0 — xem thuật toán TOTP ở bài "Sinh mã OTP theo thời gian") mà người dùng nhập có khớp với TOTP tại một trong 3 bộ đếm C−1,C,C+1C-1, C, C+1C−1,C,C+1 (với C=⌊T/30⌋C = \lfloor T/30 \rfloorC=⌊T/30⌋) hay không — tức cho phép đồng hồ client lệch ±1\pm 1±1 bước thời gian. Nếu khớp với bất kỳ giá trị nào trong 3 giá trị đó thì hợp lệ.

    Cho salt (hex), HHH (hex), mật khẩu thử ppp, khoá TOTP KKK (hex), thời điểm Unix TTT, và mã OTP người dùng nhập ooo (chuỗi 6 chữ số), hãy in ra đúng một trong ba kết quả:

    • FAIL_PASSWORD nếu mật khẩu sai.
    • FAIL_OTP nếu mật khẩu đúng nhưng mã OTP không khớp với cả 3 giá trị trong cửa sổ trên.
    • OK nếu cả hai bước đều hợp lệ.
    • Định dạng đầu vào:

      Gồm 6 dòng:

      • Dòng 1: salt dạng hex (có thể là chuỗi rỗng, biểu diễn bởi dòng trống).
      • Dòng 2: HHH dạng hex (64 ký tự).
      • Dòng 3: mật khẩu thử ppp (chuỗi, có thể rỗng — dòng có thể trống).
      • Dòng 4: khoá TOTP KKK dạng hex.
      • Dòng 5: số nguyên TTT (0≤T≤4×1090 \le T \le 4 \times 10^{9}0≤T≤4×109).
      • Dòng 6: mã OTP người dùng nhập ooo, chuỗi đúng 6 chữ số.
    • Định dạng đầu ra:

      Một dòng duy nhất: OK, FAIL_PASSWORD hoặc FAIL_OTP.

    Ví dụ:

    Đầu vào:

    001122
    8a73f6486c271244213e090cf992aa8b9483fb37cfcc8279f1403c6fc8563739
    Passw0rd!
    3132333435363738393031323334353637383930
    59
    287082
    

    Đầu ra:

    OK
    

    Đầu vào:

    001122
    8a73f6486c271244213e090cf992aa8b9483fb37cfcc8279f1403c6fc8563739
    WrongPass
    3132333435363738393031323334353637383930
    59
    287082
    

    Đầu ra:

    FAIL_PASSWORD
    

    Đang tải editor...