☰ Mục lục series
Tài liệu Go tiếng Việt
  1. Bắt đầu (Getting started)
    1. Tổng quan
    2. Tải về và cài đặt
    3. Bắt đầu với Go
    4. Quản lý các bản cài đặt Go
    5. Plugin trình soạn thảo và IDE
  2. Dạo quanh Go (A Tour of Go)
    1. Chào mừng
    2. Package, biến và hàm
    3. Điều khiển luồng
    4. Struct, slice và map
    5. Method và interface
    6. Generics
    7. Xử lý đồng thời
  3. Hướng dẫn (Tutorials)
    1. Danh sách hướng dẫn
    2. Tạo một Go module
    3. Gọi mã của bạn từ một module khác
    4. Trả về và xử lý lỗi
    5. Trả về lời chào ngẫu nhiên
    6. Trả về lời chào cho nhiều người
    7. Thêm một test
    8. Biên dịch và cài đặt ứng dụng
    9. Kết luận
    10. Bắt đầu với workspace nhiều module
    11. Phát triển RESTful API với Go và Gin
    12. Truy cập cơ sở dữ liệu quan hệ
    13. Bắt đầu với generics
    14. Bắt đầu với fuzzing
    15. Làm việc với JSON
    16. Tìm và sửa các dependency có lỗ hổng với govulncheck
    17. Tìm và khắc phục phụ thuộc có lỗ hổng với VS Code Go
    18. Viết ứng dụng web
  4. Viết code Go
    1. Cách viết mã Go
    2. Effective Go
    3. Doc Comment trong Go
  5. Module
    1. Phát triển và publish module
    2. Quản lý phụ thuộc
    3. Tổ chức một module Go
    4. Quản lý mã nguồn của module
    5. Cách đánh số phiên bản module
    6. Quy trình phát hành và đánh phiên bản module
    7. Publish một module
    8. Phát triển một bản cập nhật major version
    9. Tham chiếu tệp go.mod
    10. Ngừng hỗ trợ 'go get' cho việc cài đặt tệp thực thi
  6. Cơ sở dữ liệu (Database)
    1. Truy cập cơ sở dữ liệu quan hệ
    2. Mở một handle cơ sở dữ liệu
    3. Thực thi câu lệnh SQL không trả về dữ liệu
    4. Truy vấn dữ liệu
    5. Dùng prepared statement
    6. Thực thi transaction
    7. Huỷ các thao tác đang chạy
    8. Quản lý kết nối
    9. Tránh rủi ro SQL injection
  7. Chẩn đoán và hiệu năng
    1. Chẩn đoán
    2. Hướng dẫn về Go Garbage Collector
    3. Tối ưu hoá dựa trên profile
    4. Data Race Detector
    5. Gỡ lỗi mã Go bằng GDB
    6. Hỗ trợ coverage profiling cho integration test
  8. Bảo mật (Security)
    1. Tổng quan bảo mật
    2. Thực hành tốt về bảo mật cho lập trình viên Go
    3. Quản lý lỗ hổng trong Go
    4. Cơ sở dữ liệu lỗ hổng của Go
    5. Quét lỗ hổng trong IDE
    6. Chính sách CNA của Go
    7. Go Fuzzing
    8. Chi tiết kỹ thuật của Go Fuzzing
    9. Chính sách bảo mật của Go
    10. Threat Model của Go
    11. Các quyết định về bảo mật của Go
    12. Tuân thủ FIPS 140-3
  9. Công cụ và toolchain
    1. Tài liệu về các lệnh
    2. Về lệnh go
    3. Go Toolchains
    4. Telemetry của Go
    5. Cài đặt Go từ mã nguồn
    6. Cài đặt và sử dụng gccgo
  10. Tham khảo
    1. Câu hỏi thường gặp (FAQ)
    2. Go 1 và tương lai của các chương trình Go
    3. Hướng dẫn chuyển đổi sang encoding/json/v2
    4. Hướng dẫn đóng góp
    5. Đóng góp cho frontend gccgo
  11. Phụ lục
    1. Bảng thuật ngữ
Bảo mật (Security)

Tuân thủ FIPS 140-3

Bản dịch từ go.dev/doc/security/fips140

Kể từ Go 1.24, các binary Go có thể hoạt động một cách nguyên bản ở một mode (chế độ hoạt động) hỗ trợ tuân thủ FIPS 140-3. Hơn nữa, toolchain có thể build dựa trên các phiên bản đã đóng băng của những package mật mã cấu thành nên Go Cryptographic Module (cryptographic module — module mật mã).

FIPS 140-3

NIST FIPS 140-3 là một chế độ tuân thủ của Chính phủ Hoa Kỳ dành cho các ứng dụng mật mã, mà trong số những yêu cầu khác, đòi hỏi phải dùng một tập các thuật toán được phê duyệt, và dùng các cryptographic module đã được CMVP thẩm định, được kiểm thử trong các môi trường vận hành đích.

Các cơ chế mô tả trong trang này hỗ trợ việc tuân thủ cho các ứng dụng Go.

Những ứng dụng không có nhu cầu tuân thủ FIPS 140-3 có thể yên tâm bỏ qua chúng, và không nên bật mode FIPS 140-3.

LƯU Ý: Việc chỉ đơn thuần dùng một cryptographic module tuân thủ và đã được thẩm định theo FIPS 140-3 có thể tự nó chưa đáp ứng mọi yêu cầu pháp lý liên quan. Nhóm Go không thể đưa ra bất kỳ bảo đảm hay hỗ trợ nào về việc dùng mode FIPS 140-3 được cung cấp sẵn có thể đáp ứng, hay không đáp ứng, những yêu cầu pháp lý cụ thể của từng người dùng. Bạn nên thận trọng khi xác định liệu việc dùng module này có đáp ứng các yêu cầu riêng của bạn hay không.

Go Cryptographic Module

Go Cryptographic Module là một tập hợp các package Go trong thư viện chuẩn nằm dưới crypto/internal/fips140/..., hiện thực các thuật toán được FIPS 140-3 phê duyệt.

Các package API công khai như crypto/ecdsa và crypto/rand dùng Go Cryptographic Module một cách trong suốt để hiện thực các thuật toán FIPS 140-3.

Mode FIPS 140-3

Khi hoạt động ở mode FIPS 140-3:

  • Go Cryptographic Module tự động thực hiện một self-test (tự kiểm tra) về tính toàn vẹn tại thời điểm init, so sánh checksum của tệp object của module được tính lúc build với các symbol đã nạp trong bộ nhớ.

  • Mọi thuật toán đều thực hiện các self-test kiểu known-answer theo FIPS 140-3 Implementation Guidance tương ứng, hoặc tại thời điểm init, hoặc ở lần dùng đầu tiên.

  • Các kiểm tra tính nhất quán theo cặp (pairwise consistency test) được thực hiện trên các khoá mật mã được sinh ra. Lưu ý rằng điều này có thể làm chậm tới 2 lần với một số loại khoá nhất định, đặc biệt đáng lưu tâm với các khoá tạm thời.

  • crypto/rand.Reader được hiện thực dựa trên một DRBG theo NIST SP 800-90A. Để bảo đảm cùng mức an toàn như các chương trình không chạy ở mode FIPS 140-3, các byte ngẫu nhiên cũng được lấy từ CSPRNG của nền tảng ở mỗi lần Read và được trộn vào đầu ra dưới dạng dữ liệu bổ sung không được tính vào entropy.

  • Package crypto/tls sẽ bỏ qua và không thương lượng bất kỳ phiên bản giao thức, cipher suite, thuật toán chữ ký, hay cơ chế trao đổi khoá nào không được FIPS 140-3 phê duyệt. (Điều này tương đương với cơ chế opt-in cũ crypto/tls/fipsonly của Go+BoringCrypto.)

  • crypto/rsa.SignPSS với PSSSaltLengthAuto sẽ giới hạn độ dài của salt bằng độ dài của hash.

Mode FIPS 140-3 không được hỗ trợ trên OpenBSD, Wasm, AIX, và Windows 32-bit.

Package crypto/fips140

Hàm crypto/fips140.Enabled cho biết mode FIPS 140-3 có đang hoạt động hay không.

Hàm crypto/fips140.Version trả về phiên bản của Go Cryptographic Module đang được dùng.

Biến môi trường GOFIPS140

Biến môi trường GOFIPS140 có thể dùng với go build, go install, và go test để chọn phiên bản của Go Cryptographic Module được link vào chương trình thực thi, và để bật mode FIPS 140-3 theo mặc định.

  • off là mặc định, và dùng các package crypto/internal/fips140/... trong cây thư viện chuẩn đang dùng.

  • latest giống off, nhưng bật mode FIPS 140-3 theo mặc định.

  • v1.0.0 hoặc v1.26.0 chọn đúng phiên bản Go Cryptographic Module tương ứng. Chúng bật mode FIPS 140-3 theo mặc định.

  • inprocess và certified lần lượt tương đương với việc chỉ định phiên bản mới nhất đã lọt vào CMVP Modules In Process List và phiên bản mới nhất đã có CMVP validation certificate.

Tuỳ chọn GODEBUG fips140

Tuỳ chọn GODEBUG fips140 ở thời điểm chạy điều khiển việc Go Cryptographic Module có hoạt động ở mode FIPS 140-3 hay không. Nó không thể thay đổi sau khi chương trình đã khởi chạy.

Mặc định nó là off trừ khi GOFIPS140 được đặt lúc build.

Nếu đặt là on, mode FIPS 140-3 được bật. Điều này khả thi ngay cả khi GOFIPS140 không được đặt lúc build.

Nếu đặt là only, các thuật toán mật mã không tuân thủ FIPS 140-3 sẽ trả về lỗi hoặc panic. Lưu ý rằng đây là mode nỗ lực tối đa (best effort), dành cho việc kiểm thử, đánh giá và gỡ lỗi. Nó không nhằm để dùng trong môi trường production, nó không phải là yêu cầu của Security Policy, nó cố ý gây ra crash và những lỗi có thể không được xử lý, và nó có thể có kết quả dương tính giả hoặc âm tính giả.

Phần lớn chương trình không nên đặt tuỳ chọn này trực tiếp, mà nên dùng GOFIPS140 lúc build.

Phiên bản module, thẩm định, và tính tương thích

Google hiện có quan hệ hợp đồng với Geomys để hỗ trợ việc thẩm định CMVP cho Go Cryptographic Module ít nhất mỗi năm một lần. Tại thời điểm thẩm định, chúng tôi sẽ đóng băng Go Cryptographic Module và tạo một phiên bản module mới để nộp.

Các đợt thẩm định này được kiểm thử trên một tập toàn diện các Môi trường Vận hành, hỗ trợ nhiều tổ hợp hệ điều hành và nền tảng phần cứng phổ biến.

Các phiên bản Go Cryptographic Module cũ hơn tiếp tục được hỗ trợ và sẵn dùng chừng nào chưa có phiên bản mới hơn nào lấy được CMVP validation certificate. Một khi một phiên bản mới hơn đã lấy được CMVP validation certificate, các phiên bản cũ hơn sẽ bị loại bỏ.

Một số tính năng của thư viện chuẩn có thể không khả dụng và trả về lỗi nếu bạn dùng một Go Cryptographic Module được đóng băng từ một phiên bản Go cũ hơn.

Go Cryptographic Module v1.26.0

Go Cryptographic Module v1.26.0 được đóng băng vào đầu năm 2026 từ Go 1.26.

Nó khả dụng trong Go 1.26+.

Tính đến 2026-04-28, nó đang ở trạng thái Pending Review trong CMVP Modules In Process List. Nó được bao phủ bởi CAVP Certificate A8028.

Thay đổi so với v1.0.0

  • Đã hiện thực ML-DSA.

  • testing/cryptotest.SetGlobalRandom nay đã được hỗ trợ.

  • Giới thiệu các API tuân thủ AES-GCM mới, để dùng trong crypto/hpke và các API sẽ công khai trong tương lai.

  • Go Cryptographic Module nay dùng một Nguồn Entropy kiểu CPU jitter, với ESV Certificate #E318 và CAVP Certificate A7715. (CSPRNG của nền tảng vẫn được dùng làm nguồn dữ liệu bổ sung không tính vào entropy cho mọi byte ngẫu nhiên.)

  • Nhiều cải tiến về an toàn và hiệu năng.

Go Cryptographic Module v1.0.0

Go Cryptographic Module v1.0.0 được đóng băng vào đầu năm 2024 từ Go 1.24.

Nó khả dụng trong Go 1.24+.

Nó được bao phủ bởi CMVP Certificate #5247 và CAVP Certificate A6650.

Go+BoringCrypto

Cơ chế trước đây, không được hỗ trợ, dùng module BoringCrypto cho một số thuật toán được FIPS 140-3 phê duyệt hiện vẫn còn khả dụng, nhưng nó dự kiến sẽ bị loại bỏ và thay thế bằng cơ chế mô tả trong trang này ở một bản phát hành trong tương lai.

Go+BoringCrypto không tương thích với mode FIPS 140-3 nguyên bản.

Nội dung gốc: Go Documentation © The Go Authors, giấy phép CC BY 3.0. Bản dịch và ghi chú: Lê Văn Dũng.