Java와 Golang을 이용하여 HOTP를 구현하려던 중, 생성된 값에 불일치가 발견되었습니다. Java는 유효한 HOTP를 성공적으로 생성했지만 Golang 구현은 달랐습니다.
이 문제는 Java와 Go의 바이트 유형 표현이 다르기 때문에 발생합니다. . Java의 바이트는 -128부터 127까지의 부호가 있는 반면 Golang의 바이트는 0부터 255까지의 uint8 별칭입니다.
Java 코드에서 ByteBuffer.allocate(8).putLong(counter ).정렬(); 카운터 값에서 바이트 배열을 생성합니다. 그러나 Golang에서는 Binary.BigEndian.PutUint64(bs, counter)가 카운터를 빅엔디안 표현으로 변환하여 다른 바이트 값이 생성됩니다.
Java 코드를 Go로 포팅하고 동일한 바이트 배열이 생성되도록 하려면 Java 배열의 음수 값을 256만큼 이동해야 합니다. 부호 없는 정수로 변환합니다. 이는 다음 코드를 사용하여 달성할 수 있습니다.
for (int i = 0; i < javabytes.length; i++) { if (javabytes[i] < 0) { javabytes[i] += 256; } }
또한 Java 코드는 최종 결과에 16진수 인코딩을 사용하는 반면 Golang 코드는 Base64 인코딩을 사용합니다. Java 출력을 일치시키려면 Golang 코드에서 hex.EncodeToString(h.Sum(nil))을 사용해야 합니다.
위 내용은 Java 대 Golang HOTP 구현: 생성된 값이 불일치하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!