>백엔드 개발 >Golang >Java 대 Golang HOTP 구현: 불일치를 해결하는 방법은 무엇입니까?

Java 대 Golang HOTP 구현: 불일치를 해결하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-10 19:18:17634검색

Java vs. Golang HOTP Implementation: How to Resolve Discrepancies?

HOTP용 Java와 Golang 비교(rfc-4226)

Golang에서 HOTP를 구현하려고 하면 Java와 Golang 구현에서 생성된 출력 간에 불일치가 발생할 수 있습니다 . 이는 두 언어가 바이트 배열을 처리하는 방법, 특히 부호 있는 값과 부호 없는 값을 처리할 때 미묘한 차이가 있기 때문일 수 있습니다.

Java와 Golang 바이트 유형

Java의 바이트 유형은 부호가 있음을 의미합니다. 범위는 -128부터 127까지인 반면 Golang의 바이트 유형은 uint8의 별칭으로 범위는 0부터 255까지입니다. 차이로 인해 각 언어에서 생성되는 바이트 배열에 차이가 발생합니다.

부호 있는 값과 부호 없는 값 간의 변환

Java와 Golang에서 생성된 바이트 배열을 비교하려면 부호 있는 값을 변환해야 합니다. Java 바이트 값을 해당하는 부호 없는 값으로 변환합니다. 이는 음수 값에 256을 추가하여 달성할 수 있습니다.

for (byte b : javabytes) {
    if (b < 0) {
        b += 256;
    }
}

또는 비트 연산을 사용하여 부호 없는 형식으로 Java 바이트 값을 표시할 수 있습니다.

byteValue &= 0xff;

바이트 순서 차이

Java와 Golang의 또 다른 차이점은 긴 정수의 바이트 순서입니다. Java는 빅엔디안 바이트 순서를 따르는 반면 Golang은 리틀엔디안 바이트 순서를 사용합니다. 이는 바이트 배열의 바이트 순서가 두 언어 간에 다르다는 것을 의미합니다.

빅엔디안에서 리틀엔디안으로의 변환

Java와 Golang 간의 일관된 바이트 순서를 보장하려면 다음을 수행해야 합니다. Java의 빅엔디안 바이트 배열을 Golang의 리틀엔디안 형식으로 변환하는 데 필요합니다. 이는 외부 라이브러리를 사용하거나 바이트 순서를 수동으로 교환하여 달성할 수 있습니다.

인코딩 차이점

제공된 코드 조각에서 Java 구현은 16진수 인코딩 결과를 반환하는 반면 Golang 구현은 반환합니다. base64로 인코딩된 결과입니다. Java 출력을 일치시키려면 Golang에서 hex.EncodeToString 함수를 사용할 수 있습니다.

return hex.EncodeToString(h.Sum(nil))

서명된 대 서명되지 않은 표시

Go의 바이트 값을 서명된 방식으로 표시하려면 다음을 변환하면 됩니다. 이를 부호 있는 유형인 int8로 변환합니다.

for _, b := range gobytes {
    fmt.Print(int8(b), " ")
}

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

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