Sertifikasi FIPS 140 dan Golang
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 modul kriptografi atau pustaka tertentu memenuhi persyaratan keamanan yang ditetapkan oleh NIST. Oleh karena itu, lolosnya sertifikasi FIPS 140 berarti modul tersebut secara resmi memiliki keamanan yang dapat dipercaya, dan dapat digunakan dalam bidang-bidang yang mengutamakan keamanan seperti keuangan, medis, dan pertahanan.
FIPS 140 pertama kali ditetapkan pada tahun 1994, kemudian direvisi menjadi FIPS 140-2 pada tahun 2001, dan FIPS 140-3 pada tahun 2019. Hingga saat ini, banyak sistem dan aplikasi masih memerlukan sertifikasi FIPS 140-2 atau FIPS 140-3.
FIPS 140 dan Bahasa Pemrograman
Oleh karena itu, modul kriptografi bersertifikat FIPS 140 telah digunakan sebagai standar de facto dalam berbagai bahasa pemrograman dan lingkungan. Contoh-contoh yang menonjol termasuk OpenSSL, BoringSSL, LibreSSL, dan NSS, yang merupakan modul yang paling banyak digunakan dalam aplikasi yang mengutamakan keamanan.
Sebagian besar modul bersertifikat FIPS 140 ditulis dalam C atau C++. Oleh karena itu, bahasa seperti PHP, Python, dan Javascript mengonfigurasi lingkungan FIPS dengan menautkan melalui modul Provider eksternal, daripada menggunakan modul-modul ini 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, proses sertifikasi harus diulang, dan selama proses ini, ketidaksesuaian versi dapat terjadi antara modul yang digunakan aplikasi dan modul bersertifikat FIPS. Jika versi yang tidak sah digunakan, lingkungan tersebut tidak lagi dianggap sebagai lingkungan bersertifikat FIPS.
Pemuatan Dinamis dan Penurunan Kinerja
Sebagian besar bahasa menggunakan modul bersertifikat FIPS 140 dengan memuatnya sebagai pustaka dinamis. Metode ini dapat menyebabkan penurunan kinerja selama inisialisasi dan eksekusi, dan jika masalah terjadi selama runtime, ada risiko dampak langsung pada stabilitas keseluruhan aplikasi.
Kerentanan Keamanan
Seperti yang disebutkan di atas, dalam struktur yang menautkan modul eksternal seperti OpenSSL Provider, ada risiko kerentanan keamanan modul tersebut menyebar langsung ke aplikasi. Selain itu, lapisan komunikasi antara aplikasi dan modul eksternal itu sendiri menjadi permukaan serangan tambahan, dan lapisan keamanan terpisah diperlukan untuk melindunginya. Hal ini meningkatkan kompleksitas dan dapat menyebabkan kerentanan yang tidak terduga.
FIPS 140 dan Golang
Oleh karena itu, Golang mengambil strategi yang berbeda. Go memilih untuk tidak bergantung pada alat eksternal untuk sertifikasi FIPS 140, melainkan mendukungnya secara langsung dalam pustaka kriptografi resminya. Dengan demikian, pengembang tidak perlu menginstal atau mengonfigurasi Provider terpisah; mereka hanya perlu mengaktifkan mode bersertifikat FIPS (GOFIPS=1) sambil tetap menggunakan paket crypto standar. Proses ini menghilangkan batas komunikasi dengan modul eksternal, meningkatkan keamanan, dan menyederhanakan operasi karena hanya satu biner yang dikompilasi secara statis yang perlu didistribusikan.
FIPS 140-2 dan Golang
Untuk tujuan ini, Golang memperoleh sertifikasi FIPS 140-2 dengan menyematkan modul BoringCrypto, yang diturunkan dari BoringSSL, ke dalam runtime Go. BoringCrypto dapat diaktifkan dalam distribusi tertentu setelah versi Go 1.19, memungkinkan aplikasi Go untuk mengonfigurasi lingkungan bersertifikat FIPS 140-2 tanpa modul eksternal terpisah.
Namun, karena BoringCrypto berbasis OpenSSL, ketergantungan pada bahasa C masih ada. Oleh karena itu, aplikasi Go tidak dapat dibangun sebagai biner yang sepenuhnya independen, dan ada batasan bahwa pustaka C yang diperlukan harus didistribusikan bersama.
FIPS 140-3 dan Golang
Tim Go mengatasi keterbatasan ini dengan meningkatkan pustaka crypto standar Go yang ada agar sesuai dengan spesifikasi FIPS 140-3. Modul yang ditingkatkan ini mulai disediakan secara eksperimental sejak Go versi 1.21, dan saat ini sedang dalam proses evaluasi sertifikasi FIPS 140-3 oleh NIST.Daftar Modul dalam Proses Evaluasi FIPS 140-3 NIST
Ini menunjukkan kematangan pustaka kriptografi Go, dan melalui ini, Go mampu menyediakan lingkungan bersertifikat FIPS 140-3 sebagai biner tunggal yang sepenuhnya independen.
Selain itu, tim Go tidak hanya memenuhi standar FIPS 140-3, tetapi juga secara internal meningkatkan keamanannya.
Fail Fast
Mode FIPS Go menerapkan model keamanan Fail Fast, yang menyebabkan eksekusi segera berhenti dengan panic jika algoritma yang tidak bersertifikat dipanggil. Berbeda dengan model berbasis Provider pada bahasa lain yang menyisakan kemungkinan fallback, ini memberikan jaminan yang lebih ketat dan jelas dalam hal keamanan dan kepatuhan terhadap peraturan.
Hedged Signature
Standar FIPS 140-3 merekomendasikan metode RFC6979 untuk tanda tangan ECDSA. Namun, Go memperkenalkan metode Hedged di atasnya, yang lebih kuat dalam menghadapi serangan saluran samping yang mungkin terjadi selama proses penandatanganan.
Generator Angka Acak yang Ditingkatkan
Generator angka acak Go menggunakan DRBG (Deterministic Random Bit Generator) ruang pengguna, sambil menyuntikkan entropi tambahan ke kernel sistem operasi, menghasilkan angka acak berkualitas tinggi tidak hanya di ruang pengguna tetapi juga di ruang kernel. Hal ini semakin meningkatkan keamanan generator angka acak.