Bài viết mới nhất

Tổng 2300 bài
Lập trình 22/09/2026 10 phút

JWT đo thật: HS256 ký 394.000 mỗi giây nhưng RS256 chỉ 1.321, verify mới là nút thắt với 30.000 so với 313.000 mỗi giây, token RS256 nặng gấp đôi, golang-jwt v5 từ chối cả alg=none lẫn nhầm loại khoá khi ghim thuật toán

Đo bốn thuật toán ký JWT trong golang-jwt v5 với cùng bảy claim trên một máy 10 vCPU. HS256 ký 394.557 và verify 312.743 mỗi giây, token 255 byte; RS256 ký chỉ 1.321 và verify 30.334, token 554 byte; RSA-4096 ký 217 mỗi giây; ES256 và EdDSA token 298 byte. Verify 10 lõi: HS256 607.868, RS256 113.651. Hai cấu hình sai kinh điển, alg=none và token HS256 ký bằng khoá công khai, đều bị v5 từ chối khi server ghim thuật toán bằng WithValidMethods, chỉ lọt khi code chọn khoá theo t.Method. Thu hồi bằng deny-list theo jti với TTL bằng tuổi token.

Lập trình 22/09/2026 8 phút

DuckDB quét Parquet tại chỗ đo thật: truy vấn thẳng file bằng read_parquet mất 34,6 ms không tốn bước nạp, nạp vào bảng tốn 145 ms một lần rồi query 26,1 ms nên chỉ đáng khi chạy hơn 17 truy vấn, còn lưu .duckdb gốc thì query chỉ 13 ms

DuckDB truy vấn file Parquet trực tiếp mà không cần nạp vào cơ sở dữ liệu trước. Đo thật trên 10 triệu dòng, Parquet 41 MB: quét thẳng bằng read_parquet mất 34,6 ms mỗi truy vấn và không tốn chi phí nạp; nạp vào bảng DuckDB tốn 145 ms một lần rồi mỗi query trong bộ nhớ 26,1 ms. Điểm hoà vốn khoảng 17 truy vấn: dưới mức đó quét thẳng nhanh hơn. Lưu sang định dạng .duckdb gốc 30,8 MB nhỏ hơn Parquet, mở lại query chỉ 13 ms không phải nạp lại. Chọn cách theo số lần truy vấn.

Lập trình 22/09/2026 9 phút

Heartbeat và kết nối chết đo thật: rút cáp bằng iptables, server Go nhận ra sau bao lâu, ping/pong 4,9 giây, TCP keepalive chỉnh tay 8,4 giây, keepalive mặc định của Go 150 giây, tắt keepalive thì không bao giờ, ReadDeadline không ping giết nhầm

Server Go trong dist-lab mở sáu cấu hình WebSocket, client trong go-lab im lặng, rồi rút cáp bằng iptables DROP hai chiều để không có FIN hay RST. Ping mỗi 5 giây với pongWait 8 giây nhận ra sau 4,9 giây; TCP keepalive idle 5 giây, 3 probe cách 2 giây nhận ra sau 8,4 giây; keepalive mặc định của net/http Go sau 150,2 giây, đúng 15 cộng 9 nhân 15; tắt keepalive thì socket còn ESTABLISHED hết 300 giây; server đẩy 20 byte mỗi giây vẫn ghi thành công 300 lần khi ss báo backoff 10. ReadDeadline không ping giết client khoẻ sau đúng 10 giây. Tiến trình client chết thì mọi cấu hình thấy trong 3 ms.

Lập trình 22/09/2026 9 phút

10.000 kết nối WebSocket trên một tiến trình Go đo thật: 27 KB RSS mỗi kết nối idle với bộ đệm mặc định, 20 KB khi hạ xuống 1 KB, ping từng kết nối tốn gấp đôi CPU so với quét, ulimit 1024 gãy ở kết nối 1.018, dải cổng 28.232 cạn vì TIME_WAIT

Server Go nhận 10.000 kết nối WebSocket idle và tự chụp số liệu khi vượt mốc. Bộ đệm gorilla mặc định 4 KB cộng 4 KB: heap 225,7 MB, RSS 277,7 MB, 10.002 goroutine, tức 27 KB mỗi kết nối; hạ xuống 1 KB còn 204,5 MB. Ping mỗi 10 giây: timer riêng từng kết nối tốn 331 MB và 3,75 giây CPU trong 60 giây, quét bằng một goroutine tốn 273 MB và 1,85 giây cho cùng số ping. Ba chỗ gãy: ulimit 1024 dừng ở 1.018 kết nối; bùng nổ 10.000 connect không tràn backlog nhưng p99 tăng từ 45 lên 321 ms; đóng 10.000 rồi mở 20.000 ngay thì TIME_WAIT chiếm trọn 28.231 cổng.

Lập trình 22/09/2026 12 phút

mTLS đo thật: server đòi chứng chỉ client tốn thêm 100 µs và 533 byte mỗi bắt tay, client ký RSA-2048 thêm 770 µs, TLS 1.3 báo lỗi chứng chỉ client ở Read chứ không ở Handshake, xoay cert server và CA client với 2.000 kết nối mở không rơi cái nào

Server Go bật RequireAndVerifyClientCert, 1.000 bắt tay mỗi cấu hình: không đòi cert 270 µs CPU server, client ECDSA P-256 370 µs và gửi thêm 533 byte, client RSA-2048 đẩy CPU client lên 1.040 µs, ClientCAs 51 CA làm CertificateRequest phình 2 KB. Năm cách client sai: TLS 1.3 trả Handshake OK rồi lỗi ở Read đầu tiên, TLS 1.2 lỗi ngay ở Handshake, cert do CA khác ký khiến client Go không gửi gì nên server báo thiếu cert. Xoay cert server và CA client qua GetCertificate và GetConfigForClient: 2.000 kết nối mở sống 100%, kết nối mới nhận cert mới sau 300 ms.

Bảo mật 22/09/2026 5 phút

Sinh số ngẫu nhiên an toàn: vì sao random() thường phá vỡ cả hệ mật mã

Mọi thứ trong mật mã — khóa, salt, IV, nonce, token — đều dựa vào ngẫu nhiên KHÔNG đoán được. Nhưng random() thường là tất định: cùng seed cho cùng dãy. Bài này đo thật bằng python: random.seed(42) ra y hệt hai lần, token sinh bằng seed=timestamp tái tạo được; còn secrets/os.urandom/openssl rand thì không đoán nổi. Dùng sai nguồn ngẫu nhiên là lỗ hổng nghiêm trọng.