2017-12-05 1 views
2

Argon2 참조 구현을 사용하려고하는데 확인 중에 type 매개 변수 (i, d, id)를 사용하는 것에 다소 혼란 스럽습니다.인코딩 된 해시 값에서 Argon2 유형을 파생하는 것이 안전합니까?

비밀번호 확인을 위해 *verify* 라이브러리 중 하나를 호출해야합니다. 이러한 함수는 "높은 수준의"API와 함께 제공 :

/** 
* Verifies a password against an encoded string 
* Encoded string is restricted as in validate_inputs() 
* @param encoded String encoding parameters, salt, hash 
* @param pwd Pointer to password 
* @pre Returns ARGON2_OK if successful 
*/ 
ARGON2_PUBLIC int argon2i_verify(const char *encoded, const void *pwd, const size_t pwdlen); 
ARGON2_PUBLIC int argon2d_verify(const char *encoded, const void *pwd, const size_t pwdlen); 
ARGON2_PUBLIC int argon2id_verify(const char *encoded, const void *pwd, const size_t pwdlen); 
/* generic function underlying the above ones */ 
ARGON2_PUBLIC int argon2_verify(const char *encoded, const void *pwd, const size_t pwdlen, argon2_type type); 

혼란스러운 부분입니다 타입이기 때문에 내가 전화 (또는 일반적인 기능에 argon2_type type에 무엇을 넣어) 어떤 방법을 선택해야하는 이유 이미 char *encoded에 포함되어 있습니까?

응용 관점에서 각 암호에 어떤 유형이 사용되었는지 미리 알아야합니다. 하지만 ... 인코딩이 전부입니다. *verify* 기능이 하나만 있다면 좋지 않을까요?

ARGON2_PUBLIC int argon2_verify(const char *encoded, const void *pwd, const size_t pwdlen); 

인코딩 된 값에서 유형을 파생시킬 수 있습니까?

그래서, 질문은 다음과 같습니다

  • 는 RI 현재 API 설계는 보안에 대해 나에게 뭔가를 지시 하는가, 또는 유용성 뭔가 개발자들이 정말 방탄하지 않았다했다?
  • 인코딩 된 값에서 유형을 파생하는 것이 안전합니까? 아니면 하나의 유형을 선택하여 붙여야합니까 (일명 하드 코딩 했습니까?).

감사

+0

관련된 보안에 C를 사용하는 데주의하십시오. 위의 코드는 자체적으로 경계 검사 등을 수행하지 않는 것처럼 보입니다. BTW, 왜 저자에게 연락하지 않을까요? 나는 직접적으로 묻는 좋은 결과를 얻었습니다. (물론 그것에 대해 멋지게 할 필요가 있습니다.먼저 코드를 작성해 주셔서 감사드립니다.) –

+1

며칠 전 [github] (https://github.com/P-H-C/phc-winner-argon2/issues/234)에서 [issue on issue]를 열었습니다. 나는 아직 어떤 대답도받지 못했다. 내가이 게시물을 업데이 트됩니다. –

답변

0

혼란스러운 부분입니다 이유는 유형이 이미 문자에 포함되기 때문에, 전화 (또는 일반적인 기능에 argon2_type 유형에 무엇을 넣어) 어떤 방법을 선택해야 할 * 인코딩 된? ... 현재의 RI API 디자인이 보안에 대해 나에게 알 렸는지 아니면 유용성이 개발자가 방탄하지 않았는지 알 수 있습니까?

저자가 대답 할 수있는 것만 큼 두렵습니다. 그러나, 일반적으로 참조 구현은 사용자에게 친숙하지 않을 수 있습니다. 이는 개발자를위한 것입니다. of argon2, 라이브러리 사용자는 그리 많지 않습니다.

인코딩 된 값에서 유형을 파생시키는 것이 안전합니까? 아니면 하나의 유형을 선택하고 붙여야합니까 (일명 하드 코딩합니까?).

다운 그레이드를 허용하지 않는 것이 좋으며 이런 종류의 필터링을 구성 가능하게 만드는 것이 좋습니다.

결국 상대방이 매개 변수를 완전히 제어 할 수는 있어도 상대방이 충돌을 발견 할 가능성은 거의 없으므로 지나치게 중요하지 않습니다.

개인적으로 특정 프로토콜 버전을 실제 매개 변수와 별도로 지정하면 어떤 알고리즘을 사용할 것인지 지정합니다.

관련 문제