Rumah >pembangunan bahagian belakang >Golang >Mengapakah Pelaksanaan Java dan Golang HOTP (RFC-4226) Menghasilkan Keputusan yang Berbeza?

Mengapakah Pelaksanaan Java dan Golang HOTP (RFC-4226) Menghasilkan Keputusan yang Berbeza?

DDD
DDDasal
2024-12-11 02:17:11249semak imbas

Why Do Java and Golang HOTP (RFC-4226) Implementations Produce Different Results?

Pelaksanaan HOTP (RFC-4226) di Jawa lwn. Golang

Apabila melaksanakan HOTP (RFC-4226) di Golang, percanggahan mungkin timbul dalam menjana HOTP yang sah berbanding Java. Untuk menangani isu ini, adalah penting untuk memahami perbezaan bernuansa dalam pengendalian bait antara Java dan Golang.

Perwakilan Byte

Di Java, jenis bait ditandatangani, antara -128 hingga 127. Walau bagaimanapun, di Golang, jenis bait ialah alias untuk uint8, menghasilkan julat 0 hingga 255. Perbezaan ini penting dalam memahami perbandingan tatasusunan bait.

Pelaksanaan Java

Coretan kod Java menggunakan ByteBuffer.allocate(8).putLong(counter). array() untuk menjana tatasusunan bait untuk nilai pembilang. Khususnya, kaedah putLong menukarkan pembilang kepada integer panjang 8-bait dan menyimpannya dalam tatasusunan bait.

Pelaksanaan Golang

Dalam Golang, kod menggunakan binari .BigEndian.PutUint64(bs, pembilang) untuk menjana tatasusunan bait bagi nilai pembilang. Kaedah PutUint64 menukarkan pembilang kepada integer tidak bertanda 64-bit dan menyimpannya dalam tatasusunan bait dalam susunan besar-endian.

Percanggahan dalam Nilai Bait

Perbezaan antara kedua-dua kaedah ini berpunca daripada sifat bertanda vs tidak bertanda jenis bait. Apabila kod Java menukar nilai pembilang negatif kepada tatasusunan bait, bait yang terhasil ditafsirkan sebagai nilai yang ditandatangani. Sebaliknya, penukaran Golang mengekalkan sifat nilai pembilang yang tidak ditandatangani.

Penyelesaian

Untuk mengimbangi tafsiran bait yang berbeza, adalah perlu untuk mengalihkan nilai bait Java negatif sebanyak 256 untuk mendapatkan nilai yang tidak ditandatangani.

Base64 lwn. Pengekodan Hex

Satu lagi perbezaan antara pelaksanaan Java dan Golang terletak pada skema pengekodan yang digunakan. Pelaksanaan Java mengembalikan rentetan berkod heks, manakala pelaksanaan Golang mengembalikan rentetan berkod base64. Untuk hasil HOTP sepadan, seseorang mesti memastikan bahawa kedua-dua pelaksanaan menggunakan skema pengekodan yang sama.

Petua Tambahan

  • Untuk kejelasan visual, paparkan nilai bait dalam hex atau borang tidak ditandatangani apabila membandingkan hasil.
  • Untuk memaparkan bait Golang yang ditandatangani, tukarkannya kepada int8 sebelum percetakan.

Dengan mempertimbangkan nuansa perwakilan bait dan perbezaan pengekodan, anda boleh menyelesaikan percanggahan antara pelaksanaan Java dan Golang bagi HOTP (RFC-4226).

Atas ialah kandungan terperinci Mengapakah Pelaksanaan Java dan Golang HOTP (RFC-4226) Menghasilkan Keputusan yang Berbeza?. 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