Rumah > Artikel > pembangunan bahagian belakang > Ralat kompilasi Golang: "undefined: crypto/rand.Reader" Bagaimana untuk menyelesaikannya?
Dalam beberapa tahun kebelakangan ini, prestasi cemerlang Golang dalam kelajuan kompilasi dan keupayaan pemprosesan serentak telah mendorong semakin ramai pembangun menggunakannya untuk membina aplikasi berprestasi tinggi. Walau bagaimanapun, apabila anda berurusan dengan kata laluan, keselamatan dan fungsi berkaitan penyulitan, anda kadangkala menghadapi mesej ralat berikut: "undefined: crypto/rand.Reader". Jadi, bagaimana untuk menyelesaikan masalah ini?
Pertama sekali, perkara yang perlu kita fahami ialah mesej ralat membayangkan bahawa program tidak dapat mencari antara muka Pembaca dalam pakej crypto/rand. Antara muka ini digunakan secara meluas di Golang, terutamanya dalam keselamatan dan kod berkaitan penyulitan. Jadi, mengapa ralat ini berlaku?
Jawapannya mudah Ini kerana pakej kripto/rand perlu menggunakan penjana nombor rawak (juga dikenali sebagai sumber entropi atau kumpulan entropi) yang disediakan oleh sistem pengendalian yang berbeza, penjana nombor rawak API mungkin berbeza-beza, oleh itu, mudah alih kod mungkin terjejas. Pada masa yang sama, jika anda menggunakan Golang dalam beberapa persekitaran sistem pengendalian yang tidak konvensional, seperti menggunakan rantai alat seperti mingw-w64 atau Cygwin di bawah Windows, masalah ini juga mungkin berlaku.
Seterusnya, kami akan memperkenalkan beberapa penyelesaian kepada masalah ini:
Jika anda menggunakan versi Golang yang lebih lama (seperti v1.10 atau lebih awal), kemungkinan akan terjejas oleh masalah ini. Oleh itu, kami mengesyorkan anda menaik taraf kepada versi terkini Golang dan menggunakan rantai alat rasmi apabila boleh.
Jika sistem pengendalian anda bukan Linux, Windows, MacOS, dll., seperti menggunakan sistem terbenam tersuai atau persekitaran virtualisasi, anda perlu menyemak sama ada persekitaran sistem pengendalian menyokong nombor rawak API Penjana. Jika ia tidak disokong, anda mungkin perlu menulis sendiri pelaksanaan penjana nombor rawak dan menyuntiknya ke dalam pakej rand Golang.
CGO ialah mekanisme yang disediakan oleh pengkompil Golang yang membolehkan anda memanggil perpustakaan bahasa C atau API sistem. Jika anda menambah pilihan "-tags netgo" semasa menyusun kod, CGO akan dilumpuhkan dan pakej crypto/rand tidak akan dapat menggunakan penjana nombor rawak yang disediakan oleh sistem pengendalian. Oleh itu, kami mengesyorkan menggunakan pilihan "-tags cgo" semasa menyusun untuk memaksa CGO didayakan supaya penjana nombor rawak boleh digunakan dengan betul.
Jika tiada kaedah di atas berkesan, maka anda perlu menggunakan penjana nombor rawak tersuai yang dilaksanakan. Contohnya, dalam persekitaran Linux, anda boleh menggunakan nod peranti "/dev/urandom" untuk menjana nombor rawak Contoh kod adalah seperti berikut:
func generateRandomBytes(size int) ([]byte, error) { var buf = make([]byte, size) _, err := rand.Read(buf) if err != nil { return nil, err } return buf, nil }
Dalam persekitaran Windows, anda boleh menggunakan fungsi "BCryptGenRandom" untuk menjana. nombor rawak. Contoh kod adalah seperti berikut :
import ( "golang.org/x/sys/windows" ) func generateRandomBytes(size int) ([]byte, error) { buf := make([]byte, size) err := windows.NCryptGenRandom(nil, buf) if err != nil { return nil, err } return buf, nil }
Adalah penting untuk ambil perhatian bahawa menggunakan penjana nombor rawak yang dilaksanakan tersuai boleh menjejaskan kemudahalihan dan keselamatan kod anda, jadi terdapat pertukaran.
Ringkasnya, mesej ralat "undefined: crypto/rand.Reader" mungkin disebabkan oleh persekitaran sistem pengendalian yang tidak menyokong API penjana nombor rawak, atau ralat konfigurasi pengkompil. Kami mengesyorkan anda cuba meningkatkan kepada versi terkini Golang terlebih dahulu, memberi keutamaan untuk menggunakan rantai alat rasmi dan memaksa CGO didayakan pada masa penyusunan untuk menggunakan penjana nombor rawak dengan betul. Jika semuanya gagal, pertimbangkan untuk menggunakan pelaksanaan tersuai. Semoga kaedah di atas dapat membantu anda.
Atas ialah kandungan terperinci Ralat kompilasi Golang: "undefined: crypto/rand.Reader" Bagaimana untuk menyelesaikannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!