>백엔드 개발 >Golang >Java와 Go가 서로 다른 HOTP 값을 생성하는 이유는 무엇이며 불일치를 어떻게 해결할 수 있습니까?

Java와 Go가 서로 다른 HOTP 값을 생성하는 이유는 무엇이며 불일치를 어떻게 해결할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-11 04:56:13861검색

Why Do Java and Go Generate Different HOTP Values, and How Can I Fix the Discrepancy?

Java와 Golang의 HOTP 구현(RFC-4226)

Go에서 HOTP를 구현하려고 할 때 사용자는 Java 대응 제품과 비교하여 생성된 OTP. 이러한 차이는 종종 이들 언어가 바이트 유형을 처리하는 독특한 방식으로 인해 발생합니다.

Java에서는 바이트 데이터 유형이 -128~127 범위로 부호가 있는 반면, Go에서는 부호가 없는 범위로 부호가 지정됩니다. 이 차이는 카운터 값을 나타내는 바이트 배열 구성에서 나타납니다.

Java 코드:

final byte[] b = ByteBuffer.allocate(8).putLong(counter).array();

Go 코드:

bs := make([]byte, 8)
binary.BigEndian.PutUint64(bs, counter)

Java에서 카운터 값이 음수일 때 불일치가 발생합니다. 생성된 바이트 배열을 비교할 때 사용자는 b의 마지막 바이트에서 차이를 발견할 수 있습니다.

이 문제를 해결하려면 256을 추가하여 음수 Java 바이트 값을 조정해야 합니다. 이렇게 하면 음수 값이 이는 Go 구현과의 일치를 보장하는 긍정적인 동등물입니다.

Java 코드( 조정):

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

또한 OTP 결과에 사용되는 인코딩은 두 언어마다 다릅니다. Java는 16진수 인코딩을 사용하는 반면 Go는 기본적으로 Base64를 사용합니다. 일관성을 유지하려면 16진수 인코딩을 사용하여 결과를 출력하도록 Go 코드를 수정하세요.

Go 코드(16진수 인코딩):

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

이러한 조정을 통해 HOTP는 Go에서의 구현은 이제 Java 대응 부분과 일치하여 지정된 카운터 및 키 값에 대해 동일한 OTP 결과를 생성해야 합니다.

위 내용은 Java와 Go가 서로 다른 HOTP 값을 생성하는 이유는 무엇이며 불일치를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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