Rumah >pembangunan bahagian belakang >Golang >Pelaksanaan HOTP Java lwn Golang: Mengapa Percanggahan dalam Nilai Dijana?

Pelaksanaan HOTP Java lwn Golang: Mengapa Percanggahan dalam Nilai Dijana?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-16 10:15:13970semak imbas

Java vs. Golang HOTP Implementation: Why the Discrepancy in Generated Values?

Java lwn Golang untuk HOTP (rfc-4226)

Isu: Percanggahan dalam Penjanaan HOTP Antara Java dan Golang

Dalam percubaan untuk melaksanakan HOTP menggunakan Java dan Golang, percanggahan telah diperhatikan dalam nilai yang dijana. Walaupun Java berjaya menghasilkan HOTP yang sah, pelaksanaan Golang berbeza.

Memahami Perbezaan

Isu ini berpunca daripada perwakilan jenis bait yang berbeza dalam Java dan Go . Bait Java ditandatangani, antara -128 hingga 127, manakala bait Golang ialah alias bagi uint8, antara 0 hingga 255.

Dalam kod Java, baris ByteBuffer.allocate(8).putLong(counter ).array(); menjana tatasusunan bait daripada nilai pembilang. Walau bagaimanapun, dalam Golang, binary.BigEndian.PutUint64(bs, counter) menukarkan pembilang kepada perwakilan big-endian, menghasilkan nilai bait yang berbeza.

Solution

Untuk mengalihkan kod Java ke Go dan memastikan tatasusunan bait yang sama dijana, seseorang mesti mengalihkan nilai negatif dalam tatasusunan Java sebanyak 256 untuk menukarnya kepada integer yang tidak ditandatangani. Ini boleh dicapai menggunakan kod:

for (int i = 0; i < javabytes.length; i++) {
  if (javabytes[i] < 0) {
    javabytes[i] += 256;
  }
}

Selain itu, ambil perhatian bahawa kod Java menggunakan pengekodan hex untuk hasil akhir, manakala kod Golang menggunakan pengekodan Base64. Untuk memadankan output Java, seseorang mesti menggunakan hex.EncodeToString(h.Sum(nil)) dalam kod Golang.

Petua untuk Nyahpepijat

  • Untuk memaparkan nilai bait Java dalam cara yang tidak ditandatangani, gunakan byteValue & 0xff.
  • Untuk memaparkan nilai bait Golang dalam cara yang ditandatangani, tukarkannya kepada int8.

Atas ialah kandungan terperinci Pelaksanaan HOTP Java lwn Golang: Mengapa Percanggahan dalam Nilai Dijana?. 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