Ralat kompilasi Golang: 'undefined: crypto/rand.Reader' Bagaimana untuk menyelesaikannya?

WBOY
Lepaskan: 2023-06-24 22:40:36
asal
813 orang telah melayarinya

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:

  1. Naik taraf kepada versi Golang terkini

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.

  1. Periksa persekitaran sistem pengendalian anda

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.

  1. Paksa penggunaan CGO

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.

  1. Pelaksanaan penjana nombor rawak tersuai

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!