목차
- 해시 객체 초기화와 업데이트 예제
- 해시 값 비교 예제
- 솔트(Salt)와 sha256 해시 예제
- 해시 값을 활용한 데이터 무결성 검증 예제
- 해시 보안 적용과 주의사항
1. 해시 객체 초기화와 업데이트 예제
hashlib 모듈의 해시 함수를 사용하기 위해 해시 객체를 초기화해야 합니다.
hashlib 모듈은 다양한 해시 알고리즘을 지원하며, 이를 위해 해시 객체를 초기화할 때 사용할 알고리즘을 선택합니다.
해시 객체를 초기화한 후에는 데이터를 업데이트하여 해시 값을 계산할 수 있습니다.
다음은 해시 객체 초기화와 업데이트하는 예제입니다.
import hashlib
#해시 객체 초기화
hash_obj = hashlib.sha256()
#데이터 업데이트
data1 = "Hello"
data2 = " hashlib!"
hash_obj.update(data1.encode())
hash_obj.update(data2.encode())
#해시 값 출력
hashed_data = hash_obj.hexdigest()
print("해시 값:", hashed_data)
2. 해시 값 비교 예제
해시 함수를 사용하여 데이터를 해싱하면 항상 동일한 데이터에 대해서는 동일한 해시 값을 얻을 수 있습니다.
이를 이용하여 해시 값을 비교하면 데이터의 무결성을 검증할 수 있습니다.
다음은 해시 값 비교하는 예제입니다.
import hashlib
def hash_string(data):
hash_obj = hashlib.sha256()
hash_obj.update(data.encode())
return hash_obj.hexdigest()
# 데이터 해싱
data1 = "Hello, hashlib!"
hashed_data1 = hash_string(data1)
data2 = "Hello, hashlib?"
hashed_data2 = hash_string(data2)
# 해시 값 비교
if hashed_data1 == hashed_data2:
print("데이터 일치")
else:
print("데이터 불일치")
위와 같이 ! 와 ? 문자 한 개만 바뀌었을 뿐이지만, 해시값은 완전히 달라지기 때문에 결과가 데이터 불일치로 나오는 것을 알 수 있습니다.
3. 솔트(Salt)와 sha256 해시 예제
솔트(Salt)는 해시 함수에 사용되는 임의의 추가 데이터입니다.
솔트를 사용하면 동일한 데이터에 대해서도 항상 동일한 해시 값을 얻지 않으므로 무작위 공격을 어렵게 만듭니다.
솔트는 보통 암호화나 비밀번호 저장에 사용됩니다.
다음은 솔트와 해시를 함께 사용하는 예제입니다.
import hashlib
import os
def hash_with_salt(data):
salt = os.urandom(16) # 16바이트 무작위 솔트 생성
hash_obj = hashlib.sha256()
hash_obj.update(salt)
hash_obj.update(data.encode())
return salt, hash_obj.hexdigest()
#데이터 해싱
data = "Hello, hashlib!"
salt, hashed_data = hash_with_salt(data)
#결과 출력
print("솔트:", salt.hex())
print("해시 값:", hashed_data)
4. 해시 값을 활용한 데이터 무결성 검증 예제
해시 값을 활용하여 데이터의 무결성을 검증할 수 있습니다.
파일의 해시 값을 계산하고, 이를 나중에 다시 계산하여 파일이 변경되지 않았는지 확인할 수 있습니다.
다음은 파일 무결성 검증 예제입니다.
import hashlib
def hash_file(filename):
hash_obj = hashlib.sha256()
with open(filename, "rb") as file:
while chunk := file.read(65536):
hash_obj.update(chunk)
return hash_obj.hexdigest()
# 파일 무결성 검증
filename = "/home/wonseok/jmeter.log"
original_hash = "e0d6a3c3c376621a118e98b4ed5ce2c7e6806657f671113683da44f5d2c5649e"
hashed_file = hash_file(filename)
if hashed_file == original_hash:
print("파일 무결성 확인: 파일이 변경되지 않았습니다.")
else:
print("파일 무결성 확인: 파일이 변경되었습니다.")
5. 해시 보안 적용과 주의사항
해시 함수는 데이터 무결성 검사, 데이터 암호화 등 다양한 용도로 사용됩니다.
그러나 약한 해시 알고리즘을 선택하거나 솔트를 적절하게 사용하지 않으면 보안에 취약할 수 있습니다.
따라서 보안이 중요한 경우에는 충분한 길이의 강력한 해시 알고리즘과 솔트를 사용하는 것이 좋습니다.
또한, 해시 값 자체로는 원본 데이터를 복원할 수 없기 때문에 비밀번호 저장 등에 사용할 때에는 추가적인 보안 조치가 필요합니다.