2011-04-07 3 views
3

RSA_sign에 대한 맨 페이지()에서 NID_sha과 NID_sha1의 차이는 형식 매개 변수에 대해 말한다 뭐죠 :OpenSSL을

type denotes the message digest algorithm that was used to generate m. It usually is one of NID_sha1, NID_ripemd160 and NID_md5; see objects(3) for details. 

하지만 그에는 OpenSSL 소스 코드에서 NID_sha 또 다른 유형을 사용할 수를 참조하십시오. 누군가이 둘의 차이점을 도와 주실 수 있습니까?

SHA-256, SHA-512의 다이제스트에 서명하기 위해 RSA_Sign 함수를 사용할 계획이지만 SHA-256 및 SHA-512에 해당하는 유형 매개 변수는 표시되지 않으므로 type 매개 변수에 무엇을 입력해야합니까? 이 경우.

지금은 NID_sha 형식을 사용하고 SHA-256, SHA-512의 해시에 서명을 시도했으며 두 가지 모두 성공적으로 서명하고 나중에 서명 확인도 적절하다는 점을 알고 있습니다. 하지만 NID_sha가 무엇인지 알고 싶습니까?

모든 도움을 주시면 대단히 감사하겠습니다. 감사합니다.

답변

11

NID_sha은 SHA-1의 직접 조상 인 SHA-0을 지정합니다. SHA-0은 원래 "SHA"라고 불렸지 만 조만간 SHA-1이라고하는 수정 된 버전이 발표됩니다. 이전의 "SHA"는 구식이 아니며 이제는 전통적으로 "SHA-0"이라고합니다. 변화의 실제 이유는 공식적으로 밝혀지지 않았지만, SHA-0은 몇 년 후 독립 연구원에 의해 발견되어 충돌을 일으키는 약점이 있다고 일반적으로 이해되었습니다. 따라서 SHA-0은 "망가졌습니다"(SHA-1보다 훨씬 많음) 사용하면 안됩니다.

SHA-256으로 RSA 서명하려면 NID_sha256 (SHA-512, NID_sha512)을 사용해야합니다. NID_sha을 사용하는 경우 으로 잘못 표시됩니다. 내부적으로 서명 프로세스에는 해시 값 (m/m_len의 매개 변수는 RSA_sign())이 해시 함수를 식별하는 헤더로 채워지는 변환이 포함됩니다 (이 때문에 type 매개 변수를 통해 RSA_sign()이이 정보에 액세스해야합니다). NID_sha을 사용하면이 헤더에 "이것은 길이가 32 바이트 인 SHA-0 해시 된 값입니다."라고 표시됩니다. SHA-0 해시 값의 길이는 32 바이트가 아니라 20 바이트입니다. 이것은 SHA-0 해시 된 값이 아니라 SHA-256 해시 된 값입니다.

기본적으로 서명자는 공식 RSA 서명 표준 (PKCS#1)에서 출발하는 서명을 생성합니다. 따라서 서명을 준수하는 검증자를 통해 검증 할 수 없습니다. 그러나 RSA_verify()의 매개 변수로 NID_sha을 사용하면 verifier가 "SHA-0"헤더 (및 32 바이트 해시 값)를 기대하도록 지시합니다. 이는 코드가 작동하는 이유를 설명합니다. 즉, 검증자가 서명자와 완전히 동일한 실수를하고 두 오류가 취소됩니다.

다른 말로하면, 진정한 RSA가 아닌 그 변형인데, 언뜻보기에 진정한 것보다 덜 안전하지만 여전히 다르므로 상호 운용 할 수 없습니다. 어쨌든 이는 특정 상황에서 문제가 아니지만 일반적으로 암호화 작업의 경우 보안 허점이 미묘하기 때문에 표준의 서신을 따라야합니다. SHA-256 해시 값에 서명 할 때 NID_sha256을 사용하면 표준을 준수하는 PKCS # 1 v1.5 RSA 서명을 얻습니다.

요약하면 : 해시 값은 SHA-256에서 오는 경우 모두 RSA_sign()RSA_verify()를 들어, (SHA-512에 대한 NID_sha512)를 NID_sha256를 사용 NID_sha을 잊는다.

+0

대단히 감사합니다! 꽤 많은 황소 눈 대답. – sunnyX

+2

황소 눈을 받아들이는 것을 잊어 버렸습니다. sunny ... –

관련 문제