Rumah >pembangunan bahagian belakang >Golang >Pelaksanaan HOTP Java lwn Golang: Bagaimana Menyelesaikan Percanggahan?

Pelaksanaan HOTP Java lwn Golang: Bagaimana Menyelesaikan Percanggahan?

DDD
DDDasal
2024-12-10 19:18:17634semak imbas

Java vs. Golang HOTP Implementation: How to Resolve Discrepancies?

Java lwn. Golang untuk HOTP (rfc-4226)

Apabila cuba melaksanakan HOTP di Golang, anda mungkin menghadapi percanggahan antara output yang dihasilkan oleh pelaksanaan Java dan Golang . Ini boleh dikaitkan dengan perbezaan halus dalam cara kedua-dua bahasa mengendalikan tatasusunan bait, terutamanya apabila berurusan dengan nilai yang ditandatangani dan tidak ditandatangani.

Jenis Bait Java lwn Golang

Jenis bait Java ditandatangani, bermakna ia berkisar antara -128 hingga 127, manakala jenis bait Golang ialah alias bagi uint8, yang berkisar antara 0 hingga 255. Perbezaan ini membawa kepada variasi dalam tatasusunan bait yang dijana oleh bahasa masing-masing.

Penukaran antara Nilai Ditandatangani dan Tidak Ditandatangani

Untuk membandingkan tatasusunan bait yang dijana oleh Java dan Golang, adalah perlu untuk tukar nilai bait Java yang ditandatangani kepada nilai yang tidak ditandatangani yang sepadan. Ini boleh dicapai dengan menambah 256 kepada nilai negatif.

for (byte b : javabytes) {
    if (b < 0) {
        b += 256;
    }
}

Sebagai alternatif, anda boleh memaparkan nilai bait Java dalam format yang tidak ditandatangani menggunakan operasi bitwise:

byteValue &= 0xff;

Perbezaan Pesanan Bait

Satu lagi perbezaan antara Java dan Golang ialah susunan bait bagi integer panjang. Java mengikuti pesanan bait besar-endian, manakala Golang menggunakan pesanan bait kecil-endian. Ini bermakna susunan bait dalam tatasusunan bait akan berbeza antara kedua-dua bahasa.

Penukaran Big-Endian kepada Little-Endian

Untuk memastikan susunan bait yang konsisten antara Java dan Golang, ia adalah diperlukan untuk menukar tatasusunan byte big-endian Java kepada format little-endian Golang. Ini boleh dicapai menggunakan pustaka luaran atau dengan menukar susunan bait secara manual.

Perbezaan Pengekodan

Dalam coretan kod yang disediakan, pelaksanaan Java mengembalikan hasil yang dikodkan heks, manakala pelaksanaan Golang kembali hasil yang dikodkan base64. Untuk memadankan output Java, anda boleh menggunakan fungsi hex.EncodeToString dalam Golang.

return hex.EncodeToString(h.Sum(nil))

Paparan Ditandatangani lwn. Tidak Ditandatangani

Untuk memaparkan nilai bait Go dalam cara yang ditandatangani, anda boleh menukar mereka kepada int8, iaitu jenis yang ditandatangani.

for _, b := range gobytes {
    fmt.Print(int8(b), " ")
}

Atas ialah kandungan terperinci Pelaksanaan HOTP Java lwn Golang: Bagaimana Menyelesaikan Percanggahan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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