>백엔드 개발 >Golang >Java 대 Golang HOTP 구현: 생성된 값이 불일치하는 이유는 무엇입니까?

Java 대 Golang HOTP 구현: 생성된 값이 불일치하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-16 10:15:13967검색

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

HOTP용 Java와 Golang(rfc-4226)

문제: Java 간 HOTP 생성 불일치 그리고 Golang

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 바이트 값을 부호 없는 방식으로 표시하려면 byteValue & 0xff.
  • Golang 바이트 값을 서명된 방식으로 표시하려면 해당 값을 int8로 변환하세요.

위 내용은 Java 대 Golang HOTP 구현: 생성된 값이 불일치하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.