2016-08-08 5 views
0

OpenSSL을 사용하여 디지털 서명을 추가하여 SHA1 해시를 생성하려면 C++ 클래스를 작성하고 있습니다. 파일로 인쇄 :std :: ofstream는 unsigned char의 배열이 주어 졌을 때 여분의 바이트를 인쇄합니다. 릴리스 모드에서만

unsigned char hash[SHA_DIGEST_LENGTH]; 
SHA1((unsigned char *)temp.c_str(), temp.size(), hash); 

std::ofstream fout("resources/hash.out", std::ios::binary); 
fout << hash; 
fout.close(); 

이 코드는 디버그 모드에서 예상대로 작동합니다. 릴리스 모드에서 쓰레기처럼 지난 10있는 fout << hash 인쇄 대신 SHA_DIGEST_LENGTH = 20 바이트 (30)는, (아마도 버퍼 오버 플로우?)

나의 현재 해결 방법은 스트리밍 대신 각 문자를 인쇄하는 것입니다 :

for (int i=0; i<SHA_DIGEST_LENGTH; ++i) 
    fout.put(hash[i]); 

두 빌드 모드에서 모두 작동하지만 스트림 운영자가 문자열의 길이를 잘못 읽게 만들 수 있는지 궁금합니다. 아무도 어떤 생각을 가지고 있습니까?

기록을 위해 MSVC++ 12 (x86_amd64)로 컴파일 중입니다.

+4

'SHA1'은 버퍼를 널 종료합니까? – aschepler

+0

또한 'temp.size()'는 널 종결자를 포함하지 않습니다. – NathanOliver

+0

이것은 C가 아니므로 C 태그를 지정하지 마십시오. –

답변

3

NUL 종료 문자열에 대한 스트림 삽입 기가 선택됩니다.

그러나 임의의 바이트를 포함하는 고정 길이의 배열을 출력하려고합니다. 이는 완전히 다른 무언가이며 UB로 이어집니다.

그 대신에 보조 기능 write(buffer, size)을 사용하십시오.