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
Linda Hamiltonasal
2024-12-11 04:56:13861semak imbas

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();

Go Code:

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

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;
    }
}

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))

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!

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