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!