Tôi đang cố gắng triển khai HOTP (rfc-4226) ở Golang và tôi đang cố gắng tạo một HOTP hợp lệ. Tôi có thể tạo ra nó trong java nhưng vì một lý do nào đó việc triển khai của tôi trong Golang là khác nhau. Dưới đây là các mẫu:Java so với Golang cho HOTP (rfc-4226)
public static String constructOTP(final Long counter, final String key)
throws NoSuchAlgorithmException, DecoderException, InvalidKeyException {
final Mac mac = Mac.getInstance("HmacSHA512");
final byte[] binaryKey = Hex.decodeHex(key.toCharArray());
mac.init(new SecretKeySpec(binaryKey, "HmacSHA512"));
final byte[] b = ByteBuffer.allocate(8).putLong(counter).array();
byte[] computedOtp = mac.doFinal(b);
return new String(Hex.encodeHex(computedOtp));
}
và Go:
func getOTP(counter uint64, key string) string {
str, err := hex.DecodeString(key)
if err != nil {
panic(err)
}
h := hmac.New(sha512.New, str)
bs := make([]byte, 8)
binary.BigEndian.PutUint64(bs, counter)
h.Write(bs)
return base64.StdEncoding.EncodeToString(h.Sum(nil))
}
Tôi tin rằng vấn đề là dòng Java: ByteBuffer.allocate(8).putLong(counter).array();
tạo ra một mảng byte khác so với dòng Go: binary.BigEndian.PutUint64(bs, counter)
.
Trong Java, mảng byte sau được tạo: 83 -116 -9 -98 115 -126 -3 -48
và trong Go: 83 140 247 158 115 130 253 207
.
Có ai biết sự khác biệt trong hai dòng và cách tôi có thể chuyển dòng java để đi không?
trên thực tế, 'uint8 (-48)' là 208, không phải 207 (https://play.golang.org/p/marMBd3rwg) – JimB
@JimB Đúng vậy, byte cuối cùng không khớp. – icza
wow - TIL! hoạt động nghịch đảo sẽ là gì? (lấy phiên bản Go và tạo phiên bản java). Cảm ơn rất nhiều! –