>  기사  >  백엔드 개발  >  hmac.New(h func() hash.Hash, 키 바이트) hash.Hash는 JavaScript에서 동일합니다.

hmac.New(h func() hash.Hash, 키 바이트) hash.Hash는 JavaScript에서 동일합니다.

WBOY
WBOY앞으로
2024-02-09 08:12:18456검색

hmac.New(h func() hash.Hash, key byte) hash.Hash 在 JavaScript 中等效

PHP에서는 데이터 보안을 보호하기 위해 암호화 알고리즘을 사용해야 하는 경우가 많습니다. HMAC(해시 기반 메시지 인증 코드)는 데이터 무결성 및 신원 인증을 확인하는 데 일반적으로 사용되는 암호화 알고리즘입니다. PHP에서는 해시 함수와 키를 지정해야 하는 hmac.New() 함수를 사용하여 HMAC 인스턴스를 생성할 수 있습니다. 마찬가지로 JavaScript에서는 동일한 기능을 달성하기 위해 동일한 방법을 사용할 수 있습니다. 이 기사에서는 JavaScript에서 동등한 방법을 사용하여 HMAC 인스턴스를 생성하는 방법과 PHP와 JavaScript 간의 데이터를 암호화하고 해독하는 방법을 보여 드리겠습니다.

질문 내용

저는 며칠 동안 go lang hmac.new의 js 구현에 거의 막혔습니다. 그러나 성공하지 못했습니다. cryptocrypto-jsstablelib 模块进行实现。问题是,在go lang版本中,hmac实例可以通过hmac 인스턴스 생성을 사용합니다. 예를 들면(코드 블록이 정확하고 테스트되었습니다):

으아악

사실 저도 어떻게 되는지는 잘 모르겠어요! 모든 자바스크립트 관련 모듈에서는 hmac 创建 hmac,并且它们接受确定哈希算法的 string 에서 값을 가져올 수 없기 때문입니다.

아마도 hmac创建hmac에서 어떻게 오는지 자바스크립트로 물어보는 것이 더 나을 것 같습니다.

해결책은 무엇인가요?

go 버전의 출력이 구현의 출력과 동일하면 솔루션이 정확합니다.

해결 방법

사양(rfc 2104)에 따르면 hmac은 내부적으로 sha256과 같은 다이제스트 기능을 사용합니다.

그러나 귀하의 구현은 다이제스트 대신 내부적으로 다른 hmac을 사용하는 hmac을 적용합니다(실제로는 호환되지 않습니다). 여기서 가장 낮은 수준의 hmac만이 내부적으로 일반 다이제스트를 사용합니다. 이렇게 하면 중첩된 구조가 생성됩니다.

일반 hmac(다이제스트 포함)의 사양을 기반으로 Go 코드에 사용되는 hmac(다이제스트 대신)을 사용하여 hmac으로 확장할 수 있습니다.

hmac(k xor opad, hmac(k xor ipad, text))s. rfc2104, 섹션 2. hmac

의 정의

사양과의 차이로 인해 이러한 기능을 즉시 지원하는 자바스크립트 라이브러리를 찾는 것이 쉽지 않을 수 있습니다.
대부분의 라이브러리는 확실히 hmac를 지원하지만 nodejs의 암호화 모듈의 crypto.createhmac()과 같은 다이제스트만 지정하도록 허용합니다(hmac 아님). 다른 답변도 참조하세요. 나는 이 접근 방식이 Go 코드에서 논리를 구현하는 데 사용될 수 있다고 생각하지 않습니다.

다른 답변의 접근 방식이 작동하지 않고 원하는 기능을 갖춘 다른 자바스크립트 라이브러리를 찾을 수 없는 경우 hmac의 사양이 상대적으로 간단하므로(위 참조) 자바스크립트로 로직을 직접 구현할 수 있습니다.

다음 코드는 nodejs의 암호화 모듈 구현 예입니다.

으아악

결과:

으아악

테스트:

다음 go 코드는 동일한 결과를 생성합니다.

으아악

편집자:

이 기사에서 영감을 얻었으며 다음은 hmac_rec() 的更紧凑/高效的实现,它使用常规最后一个迭代步骤的 hmac(这也使得 gethash() 오래된 내용입니다.):

으아악

위 내용은 hmac.New(h func() hash.Hash, 키 바이트) hash.Hash는 JavaScript에서 동일합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제