Rumah > pembangunan bahagian belakang > Golang > Mengapa Java dan Go Menjana Nilai HOTP yang berbeza, dan Bagaimana Saya Boleh Membetulkan Percanggahan?

Mengapa Java dan Go Menjana Nilai HOTP yang berbeza, dan Bagaimana Saya Boleh Membetulkan Percanggahan?

Linda Hamilton
Lepaskan: 2024-12-11 04:56:13
asal
869 orang telah melayarinya

Why Do Java and Go Generate Different HOTP Values, and How Can I Fix the Discrepancy?

Java lwn Golang Pelaksanaan HOTP (RFC-4226)

Apabila cuba melaksanakan HOTP dalam Go, pengguna mungkin menghadapi percanggahan antara menjana OTP berbanding dengan rakan Java mereka. Penyimpangan ini selalunya terhasil daripada cara berbeza bahasa ini mengendalikan jenis bait.

Di Java, jenis data bait ditandatangani dengan julat -128 hingga 127, manakala dalam Go, ia tidak ditandatangani dengan julat daripada 0 hingga 255. Perbezaan ini nyata dalam pembinaan tatasusunan bait yang mewakili nilai pembilang.

Java Kod:

final byte[] b = ByteBuffer.allocate(8).putLong(counter).array();
Salin selepas log masuk

Go Code:

bs := make([]byte, 8)
binary.BigEndian.PutUint64(bs, counter)
Salin selepas log masuk

Percanggahan timbul apabila nilai pembilang negatif dalam Java. Apabila membandingkan tatasusunan bait yang dijana, pengguna mungkin melihat perbezaan dalam bait terakhir b.

Untuk menyelesaikan isu ini, adalah perlu untuk melaraskan nilai bait Java negatif dengan menambah 256. Ini mengalihkan nilai negatif kepada setara positifnya, memastikan penjajaran dengan pelaksanaan Go.

Kod Java (Dengan Pelarasan):

for (int i = 0; i < b.length; i++) {
    if (b[i] < 0) {
        b[i] += 256;
    }
}
Salin selepas log masuk

Selain itu, pengekodan yang digunakan untuk hasil OTP berbeza antara kedua-dua bahasa. Java menggunakan pengekodan heksadesimal, manakala Go menggunakan Base64 secara lalai. Untuk mencapai ketekalan, ubah suai kod Go untuk mengeluarkan hasil menggunakan pengekodan heksadesimal:

Kod Go (Pengekodan Heksadesimal):

return hex.EncodeToString(h.Sum(nil))
Salin selepas log masuk

Dengan pelarasan ini, HOTP pelaksanaan dalam Go kini harus sejajar dengan rakan Javanya, menghasilkan hasil OTP yang sama untuk pembilang dan kunci yang diberikan nilai.

Atas ialah kandungan terperinci Mengapa Java dan Go Menjana Nilai HOTP yang berbeza, dan Bagaimana Saya Boleh Membetulkan Percanggahan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan