Lưu mật khẩu với Argon2id: chọn chi phí và kiểm chứng tải (パスワード保存)
Từ bài Qiita về password hashing, xây ví dụ xác thực và rehash bằng Python, rồi chuyển lựa chọn tham số thành tiêu chí kiểm thử thực tế cho BrSE.
✍️ Tác giả nguồn:
shinkai_(新海 正明) trên Qiita.
🔗 Tiêu đề gốc: エンジニアに情報漏えいは防げないのか? ハッシュ化のコスト設計で「盗まれたあと」は変えられる
🌐 Bài gốc: Qiita · aef2dec31922dbad3c0d, đăng ngày 16/10/2026, đọc ngày 17/10/2026.
📝 Biên soạn: Tóm lược ngắn kết hợp phân tích và ví dụ riêng của BrSE.vn. Câu Nhật là bài luyện tập tự soạn, không phải trích nguyên văn tác giả.
📌 Điểm nhấn cốt lõi (Key Takeaways)
- Khi đánh giá cơ chế lưu mật khẩu, cần biết cả thuật toán, tham số và kế hoạch nâng cấp.
- Đo thời gian xác thực cùng bộ nhớ và tải đồng thời, thay vì chọn tham số chỉ từ máy cá nhân.
- Luồng kiểm thử phải bao gồm đúng mật khẩu, sai mật khẩu và nâng cấp hash cũ sau xác thực thành công.
1. Từ bài Qiita đến câu hỏi thiết kế
shinkai_ bàn về cách giảm thiệt hại nếu dữ liệu mật khẩu bị lấy đi: chi phí của phép băm ảnh hưởng khả năng dò thử. Tác giả cũng đặt vấn đề cân bằng khả năng bảo vệ với độ trễ đăng nhập. Bài biên soạn này tập trung vào cách triển khai một ví dụ nhỏ và cách đặt yêu cầu nghiệm thu, không phân tích các sự cố doanh nghiệp được nhắc trong nguồn.
Với BrSE, câu hỏi “Đã mã hóa mật khẩu chưa?” dễ nhận được câu trả lời thiếu chi tiết. Hãy yêu cầu nhóm chỉ rõ thư viện, kiểu hash, cấu hình đang chạy và nơi quản lý thay đổi cấu hình. Những thông tin đó giúp cuộc review có thứ để kiểm chứng.
パスワードの保存方式に加えて、設定値と更新方針も確認します。
Nghĩa: Ngoài phương thức lưu mật khẩu, chúng tôi còn xác nhận giá trị cấu hình và chính sách cập nhật.
2. Đặt tham số có căn cứ
OWASP Password Storage Cheat Sheet, được đối chiếu ngày 17/10/2026, đưa ra một cấu hình tối thiểu Argon2id là m=19456 KiB (19 MiB), t=2, p=1. m là tổng bộ nhớ, t là số lượt và p là độ song song; tăng p không có nghĩa tổng bộ nhớ tăng p lần. Thông số tối thiểu cần đi cùng benchmark trên môi trường đích.
Salt riêng cho mỗi hash ngăn việc tái sử dụng một bảng tính sẵn cho nhiều người dùng. SHA-256 đơn thuần, kể cả kèm salt, không thay thế thuật toán băm mật khẩu có chi phí thích ứng. Khuyến nghị và các phương án thay thế được cập nhật tại OWASP.
Trong ví dụ dưới đây, ta chọn một cấu hình tường minh để dễ review. Đây là điểm bắt đầu thử nghiệm, chưa phải cấu hình được chứng nhận phù hợp cho hệ thống của bạn.
3. Ví dụ riêng: xác thực rồi mới nâng cấp hash
Đoạn Python dùng API công khai của argon2-cffi: thư viện sinh salt, xác thực bằng verify() và kiểm tra cấu hình bằng check_needs_rehash(). VerifyMismatchError biểu thị mật khẩu không khớp. Mẫu được tự viết để chạy cục bộ, không cung cấp HTTP endpoint hay truy cập dữ liệu người dùng.
Cài thư viện trong virtualenv: python -m pip install argon2-cffi==25.1.0.
from argon2 import PasswordHasher, Type
from argon2.exceptions import VerifyMismatchError
current = PasswordHasher(
type=Type.ID, memory_cost=65536, time_cost=3, parallelism=1
)
previous = PasswordHasher(
type=Type.ID, memory_cost=19456, time_cost=2, parallelism=1
)
def verify_and_upgrade(stored_hash, candidate):
try:
current.verify(stored_hash, candidate)
except VerifyMismatchError:
return False, None
if current.check_needs_rehash(stored_hash):
return True, current.hash(candidate)
return True, None
# Chuỗi mẫu công khai; không dùng làm mật khẩu tài khoản thật.
sample = "demo-only-passphrase-2026"
old_hash = previous.hash(sample)
ok, replacement = verify_and_upgrade(old_hash, sample)
assert ok and replacement is not None
assert current.verify(replacement, sample)
assert verify_and_upgrade(replacement, sample) == (True, None)
assert verify_and_upgrade(replacement, "wrong-demo") == (False, None)
assert current.hash(sample) != current.hash(sample) # Salt ngẫu nhiên.
print("verify / mismatch / rehash / salt: OK")
replacement cần được ghi vào DB bằng transaction phù hợp trong ứng dụng thật. Có thể dùng cập nhật có điều kiện theo hash cũ để tránh ghi đè một lần đổi mật khẩu vừa xảy ra. Hash lỗi định dạng hoặc lỗi thư viện cần được xử lý ở lớp ứng dụng, không biến thành đăng nhập thành công; không ghi candidate vào log. Ví dụ chỉ bắt trường hợp sai mật khẩu để các lỗi khác còn được phát hiện.
Sơ đồ do BrSE.vn tự vẽ, phát hành theo CC0 1.0. Tệp nằm trong repository; đây không phải screenshot hoặc hình lấy từ Qiita.
4. Từ tham số đến kế hoạch thử tải
Giả sử ta dự kiến 20 phép xác thực chạy đồng thời, mỗi phép có m=64 MiB. Phép tính lập kế hoạch tự đặt là 20 × 64 = 1280 MiB cho phần bộ nhớ thuật toán. Con số này chưa bao gồm runtime, tiến trình web, kết nối DB và chi phí khác; nó không phải số đo thực tế hay mức RAM phải mua.
Thử tải cần ghi phiên bản thư viện, CPU/RAM giới hạn, worker count, mức đồng thời và dữ liệu đầu vào tổng hợp. Chạy cùng cấu hình cho cả đúng và sai mật khẩu; với rehash, đo riêng vì luồng thành công có thể phải tính thêm hash mới.
| Nhánh kiểm thử tự đề xuất | Quan sát | Câu hỏi nghiệm thu |
|---|---|---|
| Đúng mật khẩu, hash hiện hành | p50/p95, CPU, RSS | Có đạt thời gian đáp ứng đã cam kết? |
| Sai mật khẩu | Độ trễ, tải khi thử liên tiếp | Kiểm soát tần suất và mức đồng thời có hoạt động? |
| Đúng mật khẩu, hash cần nâng cấp | Thời gian băm mới, ghi DB | Có lưu thành công và tránh ghi đè đổi mật khẩu? |
| Nhiều yêu cầu cùng lúc | Queue, RSS đỉnh, lỗi | Có giữ được năng lực phục vụ dưới giới hạn container? |
Các ngưỡng số cụ thể phải được dự án thống nhất. Không lấy thời gian thư viện đo trên phần cứng khác làm SLA. Sau khi đổi tham số, lưu lại bằng chứng thử tải để người bảo trì hiểu vì sao cấu hình được chọn.
安全性だけでなく、同時ログイン時の応答時間も検証する必要があります。
Nghĩa: Cần kiểm chứng cả tính an toàn lẫn thời gian đáp ứng khi nhiều người đăng nhập đồng thời.
5. Sổ tay thuật ngữ Hán Việt
| Thuật ngữ Nhật | Furigana | Hán Việt | Nghĩa trong kỹ thuật |
|---|---|---|---|
| 保存 | ほぞん | Bảo tồn | Lưu dữ liệu |
| 認証 | にんしょう | Nhận chứng | Xác thực danh tính |
| 検証 | けんしょう | Kiểm chứng | Kiểm tra tính đúng đắn |
| 反復 | はんぷく | Phản phục | Lặp lại, iteration |
| 並列度 | へいれつど | Tịnh liệt độ | Mức song song |
| 負荷 | ふか | Phụ hà | Tải lên hệ thống |
| 更新方針 | こうしんほうしん | Canh tân phương châm | Chính sách cập nhật |
Âm Hán Việt dùng để ghi nhớ chữ; không thay cho cách diễn đạt kỹ thuật tự nhiên.
6. Ngữ pháp Nhật trong thảo luận thiết kế
| Mẫu | Ý nghĩa | Ví dụ tự soạn và bản dịch |
|---|---|---|
| ~に加えて | Ngoài… còn… | 時間に加えてメモリも測ります。— Ngoài thời gian, còn đo bộ nhớ. |
| ~だけでなく | Không chỉ… mà còn… | 方式だけでなく設定も重要です。— Cả phương thức lẫn cấu hình đều quan trọng. |
| ~に応じて | Theo, tùy vào… | 負荷に応じて調整します。— Điều chỉnh theo mức tải. |
Hồ sơ thiết kế nên để người tiếp theo trả lời được ba việc: đang dùng cấu hình nào, đã đo trong điều kiện nào, và khi nào cần xem xét lại. Đó cũng là điểm nối giữa quyết định bảo mật và công việc nghiệm thu của BrSE.