일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- apple
- 애플
- SWIFT
- MYSQL
- OSX
- kmip
- 2FA
- albumbook
- WebAuthn
- otpkey
- 앱리소스
- Android
- SwiftUI
- OTP
- openssl
- 앱스토어
- fido
- SSL
- MFA
- 앨범북
- 안드로이드
- MSYS2
- Nodejs
- css
- Xcode
- 인증
- git
- appres
- SSH
- FIDO2
Archives
- Today
- Total
인디노트
[c++] OpenSSL 라이브러리를 사용하여 C ++에서 SHA 해시 생성 본문
OpenSSL에는 코드 예제가없는 끔찍한 documentation 가 있지만 여기에는 다음이 포함됩니다.
#include <openssl/sha.h>
bool simpleSHA256(void* input, unsigned long length, unsigned char* md)
{
SHA256_CTX context;
if(!SHA256_Init(&context))
return false;
if(!SHA256_Update(&context, (unsigned char*)input, length))
return false;
if(!SHA256_Final(md, &context))
return false;
return true;
}
사용법:
unsigned char md[SHA256_DIGEST_LENGTH]; // 32 bytes
if(!simpleSHA256(<data buffer>, <data length>, md))
{
// handle error
}
그런 다음, md
는 SHA-256 메시지 바이너리를 포함하게됩니다. 비슷한 코드를 다른 SHA 패밀리 멤버에 사용할 수 있습니다. 코드에서 "256"을 바꿉니다.
더 큰 데이터를 가지고 있다면 물론 데이터 청크가 도착할 때 피드를 제공해야합니다 (여러 SHA256_Update
호출).
다음은 BIO를 사용하여 sha-1 다이제스트를 계산하는 OpenSSL 예제입니다.
#include <openssl/bio.h>
#include <openssl/evp.h>
std::string sha1(const std::string &input)
{
BIO * p_bio_md = nullptr;
BIO * p_bio_mem = nullptr;
try
{
// make chain: p_bio_md <-> p_bio_mem
p_bio_md = BIO_new(BIO_f_md());
if (!p_bio_md) throw std::bad_alloc();
BIO_set_md(p_bio_md, EVP_sha1());
p_bio_mem = BIO_new_mem_buf((void*)input.c_str(), input.length());
if (!p_bio_mem) throw std::bad_alloc();
BIO_push(p_bio_md, p_bio_mem);
// read through p_bio_md
// read sequence: buf <<-- p_bio_md <<-- p_bio_mem
std::vector<char> buf(input.size());
for (;;)
{
auto nread = BIO_read(p_bio_md, buf.data(), buf.size());
if (nread < 0) { throw std::runtime_error("BIO_read failed"); }
if (nread == 0) { break; } // eof
}
// get result
char md_buf[EVP_MAX_MD_SIZE];
auto md_len = BIO_gets(p_bio_md, md_buf, sizeof(md_buf));
if (md_len <= 0) { throw std::runtime_error("BIO_gets failed"); }
std::string result(md_buf, md_len);
// clean
BIO_free_all(p_bio_md);
return result;
}
catch (...)
{
if (p_bio_md) { BIO_free_all(p_bio_md); }
throw;
}
}
OpenSSL 에서 SHA1
함수를 호출하는 것보다 시간이 오래 걸리지 만 보편적이며 파일 스트림을 사용하여 다시 처리 할 수 있으므로 모든 길이의 데이터를 처리 할 수 있습니다.
반응형
'인증기술 > PKI 기술' 카테고리의 다른 글
[OpenSSL] API를 이용한 보안 프로그래밍 (0) | 2018.10.05 |
---|---|
JAVA에서의 AES 암호화 및 복호화 (0) | 2018.10.05 |
리눅스 환경에서 OpenSSL 설치 및 gcc 컴파일 옵션 (0) | 2018.10.05 |
OpenSSL 컴파일(compile) & 빌드(build) (0) | 2018.10.05 |
Comparison of cryptography libraries (0) | 2018.10.05 |
Comments