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 중국어 웹사이트의 기타 관련 기사를 참조하세요!