Rumah >pembangunan bahagian belakang >Golang >Pelaksanaan HOTP Java lwn Golang: Mengapa Percanggahan dalam Nilai Dijana?
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.
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.
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.
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!