1. SHA란 무엇인가?
현대 디지털 환경에서 우리는 수많은 데이터를 주고받습니다. 이때 중요한 것은 데이터가 원래 의도한 상태 그대로 유지되고 있는지, 즉 무결성(integrity)을 보장하는 것입니다. 만약 전송 과정 중에 데이터가 변조되거나 손상된다면, 그 데이터는 더 이상 신뢰하기 어렵습니다. 이를 방지하고, 데이터의 "지문" 역할을 하는 것이 바로 SHA(Secure Hash Algorithm)입니다.
SHA는 어떠한 길이의 입력 데이터라도 항상 일정한 길이의 해시 값(hash value)으로 변환하는 암호학적 해시 함수입니다. 해시 값을 통해 파일이나 메시지의 상태를 직관적으로 확인할 수 있으며, 계절마다 모습이 달라질 수 있는 나무라도 고유한 나이테 패턴(고정 길이의 해시 값)을 통해 동일한 나무임을 쉽게 식별할 수 있는 것과 비슷한 개념입니다.
2. SHA의 역사와 발전 단계
SHA는 1993년 미국 NSA(국가안보국)에 의해 개발된 이후 지속적인 개선과 진화를 거쳤습니다.
- SHA-0 및 SHA-1: 초기 버전으로 160비트 해시를 생성합니다. 하지만 시간이 흐르며 취약점이 발견되어, 현재는 SHA-1 사용이 비권장됩니다.
- SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512 등):
다양한 출력 비트 길이를 지원하며, 오늘날 널리 사용되는 안정적인 알고리즘 계열입니다. 특히 SHA-256은 HTTPS, SSL 등 다양한 보안 프로토콜과 시스템에서 사실상의 표준으로 자리 잡았습니다. - SHA-3:
완전히 다른 ‘스폰지 구조(Sponge Construction)’를 채택한 차세대 알고리즘으로, 2015년에 발표되었습니다. SHA-2의 잠재적 취약성에 대비하기 위해 설계되었으며, 향후 다양한 분야에서 점진적으로 사용될 것으로 기대됩니다.
이 발전 과정은 금속 자물쇠를 더 단단한 디지털 잠금장치로, 나아가 전혀 새로운 보안 방식으로 바꿔나가는 모습과 유사합니다. 또한 자동차 산업의 발전에 비유할 수도 있습니다. 최초의 엔진을 단 자동차(SHA-1)에서 출발해 더 안전하고 강력한 모델(SHA-2)을 거쳐 완전히 다른 구조를 가진 미래형 자동차(SHA-3)를 개발하는 과정과 비슷합니다.
3. SHA-2: 현대 암호 세계의 표준
SHA-2, 특히 SHA-256은 현재 디지털 보안 분야에서 핵심적인 역할을 합니다.
- 입력 데이터 블록화:
데이터를 512비트 단위로 나눠 처리합니다. - 초기 값 설정 및 반복 라운드 연산:
미리 정해진 초기값을 바탕으로 각 블록마다 64라운드의 복잡한 비트 연산(논리 연산, 순환 시프트 등)을 수행합니다. - 최종 압축 및 출력:
모든 블록 처리 후 256비트 길이의 해시 값을 출력합니다.
비유하자면, 다양한 재료(입력 데이터)를 정해진 레시피(64라운드 연산)에 따라 조리하면 언제나 같은 크기와 형태의 완성품(256비트 해시)이 나오는 것과 같습니다. 아주 작은 변화도 해시 결과를 크게 바꿔, 데이터 변조 여부 확인에 탁월한 능력을 보여줍니다.
4. SHA-256의 작동 원리: 내부 구조 상세 분석
SHA-256은 내부적으로 전처리(Preprocessing)와 해싱 계산(Hash Computation) 두 단계를 거쳐 해시 값을 만듭니다.
전처리 단계
- 패딩(Padding):
입력 데이터를 512비트의 배수로 맞추기 위해 1을 추가하고 0을 채우며, 마지막 64비트에는 원래 데이터 길이를 기록합니다. 예를 들어 "abc"(24비트)를 패딩하면 512비트로 확장됩니다. - 블록 분할:
패딩된 데이터를 512비트 블록 단위로 나누어 향후 연산 대상이 되게 합니다.
해싱 계산 단계
- 초기값 설정:
8개의 32비트 초기값(H0~H7)을 사용하며, 이는 표준에서 정의된 상수 값입니다. - 메시지 스케줄링(Message Scheduling):
각 512비트 블록을 16개의 32비트 워드로 나눈 뒤, 이를 확장해 총 64개의 워드(W0~W63)를 생성합니다. 확장은 특정 비트 연산(논리 연산, 순환 시프트)으로 이루어지며, 블록 내 데이터 혼합과 확산을 위해 중요합니다. - 라운드 함수(Round Function) 수행:
64라운드에 걸쳐 a, b, c, d, e, f, g, h라는 8개의 32비트 레지스터 값이 매 라운드마다 갱신됩니다. 이 과정에서 상수 K0~K63과 Ch, Maj, Σ(시그마), σ(소문자 시그마) 함수 같은 논리 연산이 활용됩니다.- Ch: 조건 선택(Choose) 함수
- Maj: 다수 결정(Majority) 함수
- Σ, σ: 비트 회전과 이동, XOR 등을 활용한 혼합 연산
- 압축(Compression) 및 업데이트(Update):
매 라운드 후 결과값이 이전 해시 값에 합쳐져 압축되고, 마지막 라운드 종료 시 ah 값이 H0H7에 더해집니다. - 최종 해시 값 생성:
모든 블록이 처리된 후 최종적으로 H0~H7을 결합해 256비트(32바이트)의 해시 값을 생성합니다.
직관적 비유: 요리 과정
- 재료 준비(전처리):
데이터를 적절한 크기로 나누고 필요한 패딩을 추가해 모든 재료를 균질하게 준비합니다. - 반복적 조리 과정(라운드 연산):
각 단계에서 재료를 비틀고, 섞고, 가열하는 과정(비트 연산)으로 복잡한 맛(해시 값)을 만듭니다. - 완성(최종 출력):
모든 과정을 마치면 항상 동일한 형태(256비트)의 완성품(해시)이 나오며, 재료에 미세한 변화가 있어도 완성 요리 맛은 전혀 달라집니다.
5. SHA의 핵심 특징
- 일방향성(One-wayness): 해시 값을 안다고 해서 원본 데이터를 복원하는 것은 실질적으로 불가능합니다. (계란 프라이를 다시 생달걀로 되돌릴 수 없는 것과 유사)
- 결정성(Determinism): 같은 입력은 항상 같은 해시 값을 생성합니다. (동일한 레시피와 재료로 같은 요리를 하면 같은 결과물이 나오는 원리)
- 충돌 회피성(Collision Resistance): 다른 입력이 같은 해시를 만드는 것은 매우 어렵습니다. (서로 다른 두 사람이 동일한 지문을 갖기 어려운 것과 비슷)
- 눈사태 효과(Avalanche Effect): 입력 데이터의 작은 변화도 해시 값을 완전히 바꿉니다. (도미노 한 개를 건드려 전체 패턴이 완전히 달라지는 현상)
6. SHA의 활용 분야
- 데이터 무결성 검증: 파일 다운로드 시 해시를 비교해 변조 여부를 확인할 수 있습니다.
- 비밀번호 저장: 비밀번호를 평문이 아닌 해시 값으로 저장하고, 솔팅(Salting)·키 스트레칭(Key Stretching) 등을 적용해 보안을 강화합니다.
- 디지털 서명(Digital Signature): 문서나 메시지에 해시를 적용한 뒤 서명하면, 수신자는 해시를 다시 계산해 문서의 변조 여부를 확인할 수 있습니다.
- 블록체인(Blockchain): 블록체인의 각 블록은 해시로 연결되어 변경 불가능한 데이터 구조를 형성합니다.
7. SHA-3: 새로운 패러다임, 스폰지 구조
SHA-3는 기존 SHA-2와 달리 스폰지 구조를 채택하여, 입력을 흡수(absorb)하고 출력값을 짜내(squeeze)내는 방식으로 동작합니다. 이로 인해 길이 확장 공격(length extension attack) 등의 문제에 대한 근본적인 방어가 가능하며, 추가적인 보안 속성을 확보했습니다.
8. 안전성, 공격, 그리고 미래
전문가 관점에서 보면 해시 함수에 대한 다양한 공격 기법과 방어 전략이 중요합니다.
- 프리이미지 공격(Preimage Attack): 주어진 해시에 대응하는 원본 데이터를 찾는 공격 (매우 어렵게 설계)
- 세컨드 프리이미지 공격(Second Preimage Attack): 특정 원본과 동일한 해시를 가지는 다른 데이터를 찾는 공격 (역시 극도로 어려움)
- 충돌 공격(Collision Attack): 서로 다른 입력이 동일한 해시를 만드는 경우 (SHA-1에서 취약점 발견, SHA-2 및 SHA-3는 충돌에 강함)
- 길이 확장 공격(Length Extension Attack): MD5, SHA-1, 일부 SHA-2 변형에서 발생 가능하지만, SHA-3는 구조적으로 방어
9. SHA의 다양한 실제 응용 사례
SHA는 이론적 중요성을 넘어 광범위한 실제 응용 분야에서 핵심 역할을 합니다.
- 블록체인 및 암호화폐: 거래 검증, 작업 증명(Proof-of-Work), 블록 연결을 통한 무결성 보장 등
- 디지털 서명: 문서 진위 및 변경 여부 확인
- 비밀번호 저장: 해싱과 솔트를 통한 안전한 비밀번호 관리
- 데이터 무결성 검증: 소프트웨어 배포, 파일 전송 시 데이터 변조 여부 확인
- SSL/TLS 인증서: 안전한 통신을 위한 핸드셰이크 및 인증서 무결성 보장
- 악성코드 탐지: 파일 해시를 통한 악성 코드 식별
- 포렌식 분석 및 법적 증거 보호: 디지털 증거물의 무결성 입증
10. SHA-256: 블록체인에서의 핵심 역할
SHA-256은 블록체인, 특히 비트코인에서 핵심적인 보안 요소입니다.
- 데이터 무결성 보장: 각 블록의 거래 정보를 해시하여 변경 시 해시 값이 달라지므로 무결성 확인이 용이[1][3].
- 블록 연결 및 체인 형성: 각 블록은 이전 블록의 해시를 포함해 전체 체인의 변조를 어렵게 함[1].
- 작업 증명(Proof-of-Work): 채굴 과정에서 SHA-256 해시 계산을 반복해 특정 조건을 만족하는 해시를 찾는 과정이 블록체인 네트워크 보안을 강화[1][2].
- 트랜잭션 검증: 각 거래를 SHA-256으로 해싱해 위변조 방지[1].
- 보안 강화: 2^256개의 가능한 해시 조합으로 충돌을 극도로 어렵게 만들어 높은 보안성을 제공[5].
- 효율적인 데이터 처리: 항상 256비트 길이 해시를 생성해 대량 데이터 처리 효율성 확보[2][3].
11. SHA-256의 보안성과 장점
다른 해시 함수들과 비교했을 때 SHA-256은 다음과 같은 장점을 갖습니다.
- 높은 충돌 저항성: 2^256개에 달하는 방대한 해시 공간으로 충돌 발생 확률이 극도로 낮음[2].
- 강력한 암호화: SHA-1, MD5 등 이전 알고리즘보다 안전하며, 현재까지 알려진 중대한 취약점 없음[6].
- 눈사태 효과: 작은 변화도 큰 해시 변화로 무결성 검증에 유용[3].
- 효율적 처리: 다양한 길이의 입력을 처리해도 일정한 256비트 해시를 출력, 대량 데이터 처리 용이[2].
- 산업 표준: 많은 보안 프로토콜(TLS, SSL, PGP 등)과 호환되며, 글로벌 기관들이 신뢰하는 표준[3].
- 광범위한 응용 분야: 블록체인, 디지털 서명, 데이터 검증 등 다양한 영역에 적용[7].
12. SHA-256의 속도 비교
SHA-256은 다른 해시 함수들과 비교했을 때 다음과 같은 속도 특성을 보입니다.
- MD5 대비: MD5보다 느리지만 훨씬 더 안전함 (벤치마크 예: MD5 392.32 MB/s, SHA-256 169.49 MB/s)[3][5][8].
- SHA-1 대비: SHA-1보다 느리지만 보안성이 높음 (SHA-1: 333.29 MB/s, SHA-256: 169.49 MB/s)[5].
- CRC32 대비: CRC32보다 훨씬 느리지만 보안성이 incomparable (CRC32: 413.73 MB/s vs SHA-256: 169.49 MB/s)[5].
- SHA-3 대비: 일반적으로 SHA-256이 SHA-3보다 빠른 경향[4][9].
SHA-256은 일부 다른 해시 함수보다 느리지만, 속도와 보안성 사이의 균형을 잘 유지하고 있어 많은 응용 분야에서 선호됩니다.
13. 데이터 크기에 따른 SHA-256 성능 변화
입력 데이터 크기에 따른 성능 특성:
- 입력 크기 증가: 데이터 크기가 클수록 처리 시간이 선형적으로 증가[1].
- 고정 출력 크기: 어떤 길이의 데이터든 256비트 해시 값을 산출[2].
- 블록 단위 처리(512비트): 데이터가 512비트 배수일 때 효율적[2].
- 패딩 처리: 비512비트 배수의 데이터에 패딩을 추가해 처리, 작은 데이터에 약간의 오버헤드 발생[2].
최적화를 위해 대용량 데이터를 청크 단위로 처리하거나, 하드웨어 가속(AES-NI 등) 또는 멀티코어 병렬 처리 기법을 사용할 수 있습니다[1].
14. Python 내장 라이브러리를 통한 SHA 사용 예제
Python은 hashlib 모듈을 통해 MD5, SHA-1, SHA-2(SHA-256, SHA-512 등) 계열 해시 함수를 지원합니다. 이를 활용하면 쉽고 안전하게 해시 값을 계산할 수 있습니다.
SHA-256 해시 계산 예제
import hashlib
data = "Hello, SHA!"
# 문자열을 바이트로 인코딩
encoded_data = data.encode('utf-8')
# SHA-256 해시 객체 생성
hash_obj = hashlib.sha256(encoded_data)
# 해시 값(16진수 표현) 얻기
hash_value = hash_obj.hexdigest()
print("Original data:", data)
print("SHA-256 hash:", hash_value)
실행 결과 예시:
Original data: Hello, SHA!
SHA-256 hash: 6a3a3f0a5937b67ec3f1aef9ad0d570f6fa1ada4bb6feab3ce7c7ee882ce6d3b
파일 해시 계산 예제
파일 무결성 검증이나 다운로드 완료 후 해시 체크를 위해 자주 사용합니다.
import hashlib
file_path = "example_file.txt"
sha256_hash = hashlib.sha256()
with open(file_path, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
sha256_hash.update(chunk)
print("File:", file_path)
print("SHA-256 hash:", sha256_hash.hexdigest())
위 코드는 example_file.txt를 4096바이트 단위로 읽어 SHA-256 업데이트를 반복하며, 최종 해시 값을 출력합니다.
15. SHA-256의 간략한 구현 아이디어 (학습용)
아래 코드는 실제 표준 구현보다 훨씬 단순화된 예시이며, 교육 목적으로만 사용하시기 바랍니다. 실제로는 최적화, 보안, 정확도 면에서 표준 구현(hashlib)을 사용하는 것이 좋습니다.
아래 예제는 SHA-256 알고리즘의 핵심 아이디어 중 일부만 반영하고 있으며, 실제 RFC 6234 표준 구현에 비해 매우 단순화되어 있습니다.
SHA-256 간략 구현 개요
- 패딩을 통해 입력을 512비트(64바이트) 단위로 맞추기
- 초기 해시 값(H0~H7) 사용
- 메시지 스케줄링(64개의 워드 생성)
- 64라운드 연산 수행 후 최종 해시 도출
아래 코드는 단순 이해를 돕기 위해 외부 자료를 참고하여 일부 과정을 구현한 예제입니다. 이 코드는 완전한 프로덕션 레벨 구현이 아니며, 성능이나 보안적 측면에서 검증되지 않았습니다. (실제 SHA-256 구현 상세는 RFC 6234 및 표준 라이브러리를 참조하세요.)
import struct
# SHA-256 초기 해시 값 (H0~H7)
H = [
0x6a09e667,
0xbb67ae85,
0x3c6ef372,
0xa54ff53a,
0x510e527f,
0x9b05688c,
0x1f83d9ab,
0x5be0cd19
]
# SHA-256에서 사용하는 상수 K
K = [
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
]
def right_rotate(value, shift):
return ((value >> shift) | (value << (32 - shift))) & 0xffffffff
def sha256_pad(message):
# 바이트 길이
ml = len(message)
# 패딩: 1비트를 추가한 뒤 0 패딩
# 최종적으로 (ml + 1 + k) % 64 = 56이 되도록 하는 k를 찾음
# 마지막 64비트에 원래 길이(비트 단위) 기록
bit_len = ml * 8
# 1비트 추가: 0x80 = 1000 0000
message += b'\x80'
# 64비트 추가 공간을 남기기 위해 0으로 패딩
while (len(message) % 64) != 56:
message += b'\x00'
# 원래 길이를 64비트 big-endian으로 추가
message += struct.pack('>Q', bit_len)
return message
def sha256_compress(chunk, H_values):
# chunk: 512비트(64바이트)
w = list(struct.unpack('>16L', chunk))
# 메시지 스케줄링
for i in range(16, 64):
s0 = (right_rotate(w[i-15], 7) ^ right_rotate(w[i-15], 18) ^ (w[i-15] >> 3)) & 0xffffffff
s1 = (right_rotate(w[i-2], 17) ^ right_rotate(w[i-2], 19) ^ (w[i-2] >> 10)) & 0xffffffff
w.append((w[i-16] + s0 + w[i-7] + s1) & 0xffffffff)
a, b, c, d, e, f, g, h = H_values
# 64 라운드 연산
for i in range(64):
S1 = (right_rotate(e, 6) ^ right_rotate(e, 11) ^ right_rotate(e, 25)) & 0xffffffff
ch = (e & f) ^ ((~e) & g)
temp1 = (h + S1 + ch + K[i] + w[i]) & 0xffffffff
S0 = (right_rotate(a, 2) ^ right_rotate(a, 13) ^ right_rotate(a, 22)) & 0xffffffff
maj = (a & b) ^ (a & c) ^ (b & c)
temp2 = (S0 + maj) & 0xffffffff
h = g
g = f
f = e
e = (d + temp1) & 0xffffffff
d = c
c = b
b = a
a = (temp1 + temp2) & 0xffffffff
H_values[0] = (H_values[0] + a) & 0xffffffff
H_values[1] = (H_values[1] + b) & 0xffffffff
H_values[2] = (H_values[2] + c) & 0xffffffff
H_values[3] = (H_values[3] + d) & 0xffffffff
H_values[4] = (H_values[4] + e) & 0xffffffff
H_values[5] = (H_values[5] + f) & 0xffffffff
H_values[6] = (H_values[6] + g) & 0xffffffff
H_values[7] = (H_values[7] + h) & 0xffffffff
def sha256(message):
# 초기값 복사
H_local = H[:]
# 패딩
padded_msg = sha256_pad(message)
# 512비트 블록 단위 처리
for i in range(0, len(padded_msg), 64):
chunk = padded_msg[i:i+64]
sha256_compress(chunk, H_local)
# 최종 해시 값
return ''.join('{:08x}'.format(h_val) for h_val in H_local)
# 예제 실행
test_str = b"hello"
print("Input:", test_str)
print("SHA-256:", sha256(test_str))
# 이 결과는 hashlib.sha256(b"hello").hexdigest()와 동일한 결과를 내야 함.
검증:
import hashlib
correct = hashlib.sha256(b"hello").hexdigest()
print("hashlib SHA-256:", correct)
위의 코드는 SHA-256 알고리즘의 기본 아이디어를 파이썬으로 재현한 예시이며, 실제 표준 구현과 대등한 성능이나 안전성, 최적화를 제공하지는 않습니다. 하지만 이를 통해 패딩, 메시지 스케줄링, 라운드 함수, 압축 과정 등 SHA-256의 내부 메커니즘을 어느 정도 엿볼 수 있습니다.
결론
SHA 알고리즘은 디지털 시대에 데이터를 보호하는 핵심적인 수단으로서, 무결성·신뢰성·보안성을 지원하는 토대가 됩니다. 초기의 SHA-1에서 개선된 SHA-2, 그리고 새로운 패러다임을 제시한 SHA-3에 이르기까지, 해시 알고리즘은 끊임없는 진화를 거듭하며 각종 공격 벡터에 대비하고 있습니다. 특히 SHA-256은 블록체인, 디지털 서명, 비밀번호 관리, 데이터 무결성 검증 등 다양한 분야에서 실질적으로 활용되며, 높은 보안성과 광범위한 호환성으로 현대 암호화 기술의 표준으로 자리잡았습니다.
SHA를 이해하는 것은 디지털 세계를 움직이는 핵심 언어를 읽을 수 있는 능력을 갖추는 것과 같습니다. 이를 바탕으로 우리는 더욱 안전한 디지털 사회를 건설하고, 신뢰할 수 있는 정보 교류를 실현할 수 있습니다.
참고 자료
본문 전반에 언급된 참조 자료(원문 및 추가 내용에서 제시된 모든 참고 링크를 종합)
[1] https://alpha.biz/ko/blog/encryption-technology/
[2] https://www.codestates.com/blog/content/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%95%B4%EC%8B%9C%ED%95%A8%EC%88%98
[3] https://velog.io/@lobinb797/Day146-BlockChain-
[4] https://kwjdnjs.tistory.com/53
[5] https://plisio.net/ko/blog/how-does-hashing-in-blockchain-work
[6] https://www.securew2.com/blog/what-is-sha-encryption-sha-256-vs-sha-1
[7] https://www.restack.io/p/secure-hashing-techniques-answer-sha256-vs-sha3-cat-ai
[8] https://www.baeldung.com/cs/md5-vs-sha-algorithms
[9] https://www.geeksforgeeks.org/sha-256-and-sha-3/
추가 참고 자료
[10] https://onecoin-life.com/75
[11] https://danyoujeong.tistory.com/224
[12] https://magomercy.com/algorithm/%ED%95%B4%EC%8B%9C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%A2%85%EB%A5%98-%EC%86%8C%EA%B0%9C-MD-SHA-CRC-%EB%93%B1-4272c523
[13] https://programmer7895.tistory.com/120
[14] https://signmycode.com/blog/md5-vs-sha1-vs-sha2-vs-sha3
[15] https://coding-by-head.tistory.com/entry/cy-sha2-hash
[16] https://jolynch.github.io/posts/use_fast_data_algorithms/
[17] https://hackage.haskell.org/package/cryptohash-sha256
[18] https://blog.pagefreezer.com/sha-256-benefits-evidence-authentication
[19] https://codesigningstore.com/hash-algorithm-comparison
[20] https://www.sectigo.com/resource-library/what-is-sha-encryption
[21] https://www.linkedin.com/advice/1/what-advantages-disadvantages-sha256-over-md5-sha-skills-encryption
[22] https://www.ninjaone.com/blog/sha1-vs-sha2-and-sha256/
[23] https://arxiv.org/html/2407.08284v1
[24] https://crypto.stackexchange.com/questions/68307/what-is-the-difference-between-sha-3-and-sha-256
[25] https://www.febooti.com/products/filetweak/members/hash-and-crc/hash-benchmark/
[26] https://www.linkedin.com/pulse/performance-md5-sha1-sha256-sha384-sha512-hashing-c-larry
'과학 | 테크' 카테고리의 다른 글
DQN(Deep Q-Network)의 이해: 강화학습의 혁신적 발걸음 (2) | 2024.12.18 |
---|---|
GPT-4: 차세대 언어 모델이 열어가는 새로운 대화의 시대 (3) | 2024.12.11 |
Segment Anything (세그먼트 애니씽): 모든 이미지를 자유자재로 분할하는 새로운 패러다임 (1) | 2024.12.11 |
VAE: 상상력을 가진 인공지능, Variational Auto-Encoder (30) | 2024.12.09 |
Autoencoder: 데이터의 본질을 찾아내는 인공지능 (0) | 2024.12.09 |