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

Bắt tay TLS 1.3 đọc từng record: ClientHello 1.474 byte vì Kyber, 12 record và 1 RTT, TLS 1.2 tốn thêm đúng 50 ms một RTT dưới netem, session ticket cắt 539 byte và chữ ký nhưng không cắt RTT, còn 0-RTT đưa request tới server sớm hơn 50,7 ms

Client Go ghi từng record TLS: TLS 1.3 đầy đủ gửi 1.583 byte, nhận 2.075 byte, 12 record, ClientHello 1.474 byte vì Go 1.23 bật X25519 cộng Kyber768. Dưới netem 50 ms chiều server về client: TLS 1.3 có phản hồi sau 172 ms, TLS 1.2 sau 222 ms vì thêm một lượt chờ server, resumption bằng ticket vẫn 172 ms nhưng bớt Certificate và CertificateVerify, nhận 1.536 thay vì 2.075 byte. 0-RTT bằng openssl s_server với early_data: server nhận request sau 81,0 ms thay vì 131,7 ms, sớm hơn đúng một RTT, kèm Early data was accepted. Go crypto/tls không hỗ trợ 0-RTT trên TCP.

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

Chứng chỉ và chuỗi tin cậy đo thật: tự dựng CA rồi làm hỏng từng thứ, Go và curl chặn đủ 5 biến thể nhưng Go gộp ba lỗi vào một câu, lệch giờ 2 ngày biến chứng chỉ chưa hiệu lực thành hợp lệ, chuỗi RSA nặng 1.908 byte và bắt tay chậm gấp 2,5 lần

Dựng CA gốc, CA trung gian và chứng chỉ leaf bằng crypto/x509, rồi phục vụ 7 biến thể trên 7 cổng: đúng, thiếu intermediate, sai SAN, hết hạn, chưa hiệu lực, tự ký, và chuỗi RSA. Client Go, curl và openssl s_client cùng chặn đủ 5 biến thể hỏng, nhưng Go báo thiếu intermediate, tự ký và sai root bằng cùng một câu unknown authority, còn OpenSSL cho mã 20, 18, 20. Đẩy đồng hồ client lên 2 ngày thì chứng chỉ chưa hiệu lực được chấp nhận. Chuỗi ECDSA P-256 server gửi 860 byte, bắt tay p50 0,54 ms; chuỗi RSA 1.908 byte, 1,34 ms. Kèm cách đọc lỗi và việc phải làm khi copy nhầm file.

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.

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

Secret trong tiến trình đo thật: os.Unsetenv không xoá được /proc/pid/environ nhưng chặn được tiến trình con, log %+v và docker inspect lộ nguyên văn, core dump 118 MB giữ mọi bản sao trừ []byte đã zero, 0400 và tmpfs không cản root

Một binary Go cầm secret qua env, file 0400, tmpfs và argv, chạy hai chế độ rồi đi tìm nó ở chín chỗ. Log %+v in nguyên mật khẩu, kiểu Redacted in [REDACTED]. /proc/pid/environ vẫn giữ ENV_SECRET sau os.Unsetenv, nhưng tiến trình con không còn thấy. Quét /proc/pid/mem: 5 bản sao ở chế độ xấu, 2 ở chế độ tốt. Core dump 118 MB chứa env, mount, argv và bản file cũ nếu không zero, 0 nếu đã zero; ulimit -c 0 thì không có core. uid 65534 bị từ chối đọc file 0400, root đọc bình thường. docker inspect và docker top từ host lộ -e và argv. Watcher mtime tải lại secret sau 400 đến 467 ms, SIGHUP tức thì.

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

Băm mật khẩu đo thật: bcrypt cost 12 mất 211 ms, scrypt N=2^17 mất 161 ms với 128 MB, Argon2id t=3 m=128 MB mất 231 ms, kẻ tấn công cầm đúng máy này thử 70 triệu sha256 nhưng chỉ 9 đến 117 lần mỗi giây với ba hàm chậm, và nâng cost ngay lúc đăng nhập

Quét tham số ba hàm băm mật khẩu trên một máy 10 vCPU: bcrypt nhân đôi mỗi bậc cost và không dùng RAM, scrypt nhân đôi cả thời gian lẫn RAM theo N, Argon2id tốn 0,58 ms cho mỗi MB nhân vòng và p=4 chia đều ra 4 lõi. Ở ngưỡng 250 ms một lần đăng nhập: bcrypt 12, scrypt 2^17, Argon2id t=3 m=128 MB. Kẻ tấn công với 10 lõi: 70 triệu sha256 mỗi giây quét từ điển 14 triệu trong 0,2 giây; bcrypt 12 còn 29 lần mỗi giây tức 5,5 ngày; Argon2id 256 MB còn 9 lần mỗi giây vì nghẽn băng thông RAM. Kèm nâng cost khi đăng nhập bằng bcrypt.Cost, chuỗi PHC cho Argon2id, và lỗi bcrypt với mật khẩu quá 72 byte.

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.