Struktur Implementasi FIPS 140-2 dan FIPS 140-3 pada Pustaka Kriptografi Standar Go

FIPS 140 (Federal Information Processing Standard Publication 140)
FIPS 140 adalah standar sertifikasi keamanan modul kriptografi yang ditetapkan oleh NIST Amerika Serikat. Standar ini mengevaluasi apakah suatu modul atau pustaka kriptografi tertentu memenuhi persyaratan keamanan yang ditetapkan oleh NIST. Oleh karena itu, lolos sertifikasi FIPS 140 berarti modul tersebut memiliki keamanan yang secara resmi dapat dipercaya, dan hal ini berarti modul tersebut dapat digunakan di bidang-bidang yang sangat mengutamakan keamanan, seperti keuangan, kesehatan, dan pertahanan.
Sejak pertama kali ditetapkan pada tahun 1994, FIPS 140 telah direvisi menjadi FIPS 140-2 pada tahun 2001 dan menjadi FIPS 140-3 pada tahun 2019. Hingga saat ini, banyak sistem dan aplikasi masih mensyaratkan sertifikasi FIPS 140-2 maupun FIPS 140-3.
FIPS 140 dan Bahasa Pemrograman
Oleh karena alasan tersebut, modul kriptografi yang tersertifikasi FIPS 140 digunakan secara de facto sebagai standar di berbagai bahasa pemrograman dan lingkungan. Contoh yang paling representatif antara lain OpenSSL, BoringSSL, LibreSSL, dan NSS, yang merupakan modul paling luas digunakan dalam aplikasi yang mengutamakan keamanan.
Sebagian besar modul FIPS 140 bersertifikat ditulis dalam C atau C++. Karena itu, bahasa seperti PHP, Python, dan Javascript umumnya membangun lingkungan FIPS dengan menghubungkan modul-modul tersebut melalui modul Provider eksternal, alih-alih menggunakannya secara langsung. Namun, pendekatan ini memiliki beberapa keterbatasan.
Masalah ketidaksesuaian versi
Sertifikasi FIPS 140 hanya diberikan untuk versi tertentu. Oleh karena itu, untuk menggunakan modul versi terbaru diperlukan proses sertifikasi ulang, dan dalam proses ini dapat terjadi ketidaksesuaian versi antara modul yang digunakan aplikasi dengan modul tersertifikasi FIPS. Jika versi yang tidak diotorisasi digunakan, lingkungan tersebut tidak lagi dianggap sebagai lingkungan tersertifikasi FIPS.
Pemuatan dinamis dan penurunan performa
Sebagian besar bahasa memuat modul tersertifikasi FIPS 140 sebagai pustaka dinamis. Metode ini dapat menimbulkan penurunan performa pada tahap inisialisasi dan eksekusi, serta berisiko secara langsung memengaruhi stabilitas keseluruhan aplikasi apabila terjadi masalah saat runtime.
Kerentanan keamanan
Sebagaimana telah disebutkan di atas, dalam struktur yang menghubungkan modul eksternal seperti OpenSSL Provider, kerentanan keamanan pada modul tersebut berisiko menyebar langsung ke aplikasi. Selain itu, lapisan komunikasi antara aplikasi dan modul eksternal itu sendiri menjadi permukaan serangan tambahan, sehingga diperlukan lapisan keamanan terpisah untuk melindunginya. Hal ini meningkatkan kompleksitas dan dapat menimbulkan kerentanan yang tidak terduga.
FIPS 140 dan Golang
Oleh karena alasan tersebut, Golang mengambil pendekatan yang berbeda. Go tidak bergantung pada alat eksternal untuk FIPS 140, melainkan memilih untuk mendukungnya secara langsung melalui pustaka kriptografi resmi. Dengan demikian, pengembang tidak perlu memasang atau mengonfigurasi Provider tambahan. Mereka cukup menggunakan paket crypto standar dan mengaktifkan mode FIPS (GOFIPS=1). Dengan cara ini, batas komunikasi dengan modul eksternal dihilangkan sehingga keamanan semakin kuat, dan operasional menjadi lebih sederhana karena cukup mendistribusikan satu biner statis hasil kompilasi.
FIPS 140-2 dan Golang
Untuk tujuan ini, Golang memperoleh sertifikasi FIPS 140-2 dengan menanamkan modul BoringCrypto, yang berasal dari BoringSSL, ke dalam runtime Go. BoringCrypto dapat diaktifkan pada distribusi tertentu sejak Go 1.19, dan melalui cara ini aplikasi Go dapat membentuk lingkungan tersertifikasi FIPS 140-2 tanpa modul eksternal tambahan.
Namun, karena BoringCrypto berbasis OpenSSL, ketergantungan terhadap bahasa C tetap ada. Oleh karena itu, aplikasi Go tidak sepenuhnya dibangun sebagai biner mandiri, dan terdapat keterbatasan karena pustaka C yang diperlukan harus didistribusikan bersama aplikasi.
FIPS 140-3 dan Golang
Untuk mengatasi keterbatasan tersebut, tim Go telah meningkatkan pustaka kriptografi standar Go agar sesuai dengan standar FIPS 140-3. Modul yang ditingkatkan ini mulai tersedia secara eksperimental sejak Go 1.21, dan saat ini sedang menjalani proses penilaian sertifikasi FIPS 140-3 oleh NIST.Daftar modul yang sedang dinilai untuk FIPS 140-3 oleh NIST
Hal ini menunjukkan kematangan pustaka kriptografi Go, dan dengan itu Go kini dapat menyediakan lingkungan tersertifikasi FIPS 140-3 melalui satu biner mandiri yang sepenuhnya independen.
Selain itu, tim Go tidak hanya berhenti pada pemenuhan standar FIPS 140-3, tetapi juga memperkuat keamanan secara mandiri.
Fail Fast
Mode FIPS pada Go menerapkan model keamanan Fail Fast, yaitu ketika algoritma yang tidak tersertifikasi dipanggil, eksekusi segera dihentikan dengan panic. Berbeda dengan model berbasis Provider pada bahasa lain yang menyisakan kemungkinan fallback, pendekatan ini memberikan jaminan yang lebih ketat dan jelas dari sisi keamanan dan kepatuhan regulasi.
Hedged Signature
Standar FIPS 140-3 merekomendasikan metode RFC6979 untuk penandatanganan ECDSA. Namun, Go menambahkan metode Hedged, sehingga lebih kuat dalam menghadapi serangan side-channel yang dapat terjadi selama proses penandatanganan.
Generator bilangan acak yang diperkuat
Generator bilangan acak Go menggunakan DRBG (Deterministic Random Bit Generator) di ruang pengguna, sekaligus menyuntikkan entropi tambahan dari kernel sistem operasi, sehingga menghasilkan bilangan acak berkualitas tinggi tidak hanya di ruang pengguna tetapi juga di ruang kernel. Dengan cara ini, keamanan generator bilangan acak semakin diperkuat.