비밀번호 해싱

Feb 08 2023
암호의 공격 표면
가장 파괴적인 사이버 보안 공격 중 일부는 서버 측 데이터베이스에 제대로 저장되지 않는 비밀번호 유출로 인해 발생합니다. 기본적이고 기억하기 쉬운 암호를 설정하려는 경향이 있는 사용자로부터 문제가 시작될 수 있습니다.
Unsplash에 있는 Michael Dziedzic의 사진

가장 파괴적인 사이버 보안 공격 중 일부는 서버 측 데이터베이스에 제대로 저장되지 않는 비밀번호 유출로 인해 발생합니다.

기본적이고 기억하기 쉬운 암호를 설정하려는 경향이 있는 사용자로부터 문제가 시작될 수 있습니다. 이는 공격자가 애완 동물이나 친척의 이름과 같이 개인에 대한 상황을 이해하고 있는 경우 쉽게 추측할 수 있으므로 위험을 초래합니다.

더 복잡한 암호를 선택한 경우에도 암호 크래커 소프트웨어는 무차별 암호 대입 공격을 촉발하여 성공할 때까지 많은 수의 암호를 시도할 수 있습니다.

또 다른 공격 벡터는 자격 증명을 저장하는 데이터베이스에 대한 액세스 권한을 얻는 것입니다. CISO의 악몽 같은 시나리오에서 공격자가 암호화되지 않은 일반 텍스트 암호 데이터베이스에 대한 액세스 권한을 얻으면 수천 개의 사용자 계정이 즉시 손상될 수 있습니다. 이는 불행히도 너무 자주 발생하여 소규모 및 대규모 조직 모두에 영향을 미쳤습니다.

겁내지 마세요. 이러한 불안한 잠재 고객은 비밀번호 해싱이라는 것으로 제한될 수 있습니다!

Unsplash의 Markus Spiske 사진

해싱 정의

암호 해싱은 일반 텍스트를 사용하여 복잡한 해시 함수를 실행하고 해시된 텍스트를 생성하는 암호화 알고리즘 기술입니다. 이 과정의 핵심은 기능이지만 크랙 방지에 모두 똑같이 적합한 것은 아닙니다.

모든 기능은 OWASP(오픈 소스 웹 애플리케이션 보안 프로젝트)의 기준을 충족하기 위해 두 가지 주요 속성을 충족해야 합니다.

원하는 특정 출력에 해당하는 초기 입력을 생성하는 것은 어렵습니다.

이러한 특성을 설명하기 위해 널리 사용되는 sha256 암호화 알고리즘을 통해 생성된 '비밀번호'의 해시는 다음과 같습니다.

e7cf3ef4f17c3999a94f2c6f612e8a888e5b1026878e4e19398b23bd38ec221a

그리고 '암호'의 해시는 다음과 같습니다.

5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

보시다시피 입력의 한 글자만 대문자로 바꾸면 확연히 다른 출력이 나오므로 입력에서 출력을 쉽게 판단할 수 없습니다.

해시를 생성하는 것은 실용적이지만 해시 값만 알려진 경우 입력을 다시 생성하는 것은 사실상 불가능합니다.

일반 텍스트 암호가 다시 일반 텍스트로 해독되기 전에 암호화된 텍스트로 변환되는 암호화와 달리 해싱은 하나의 기능입니다. 암호 해싱은 결정적이므로 동일한 입력은 항상 동일한 출력을 생성합니다.

이것의 사용 사례는 사용자가 비밀번호를 생성하고 해시될 수 있으며 출력이 데이터베이스에 저장되는 경우입니다. 사용자가 암호를 다시 시도하면 암호가 다시 해시된 다음 데이터베이스의 해시에 대해 확인됩니다. 공격자가 해시 데이터베이스에 대한 액세스 권한을 얻으면 암호를 다시 일반 텍스트로 변환할 수 없으므로 거의 쓸모가 없습니다.

이 Python 스크립트를 실행하여 이 개념 의 간단한 버전을 확인하십시오.

# this and other fun scripts can be found at: https://github.com/Jay-Gokani

# install sha256 library for hashing
from hashlib import sha256

# demo explanation
print ('Hello, this demo will ask for a plaintext password, hash it and will verify the hash for access requests')

# first hash stored as a variable
hash1 = (sha256(input('What phony password would you like to set? ').encode('utf-8'))).hexdigest()
print('The hash of your plaintext password is:', hash1)

# password hash stored confirmation
print ('Your password hash has been successfully stored.')

# promt the user for password re-entry, hash and store as another variable
hash2 = (sha256(input('I will test your hash. Please type your password: ').encode('utf-8'))).hexdigest()
print('The hash of your plaintext password is:', hash2)

# access approval or deny check
while True:
    if hash1 == hash2:
        print('Success - password hash matches.')
        break
    else:
        print('The password hash does not match. Please run the programme again.')
        break

물론 해시는 손상된 암호를 방지하는 올인원 솔루션이 아닙니다. 예를 들어 공격자는 일반적인 암호 및 해당 해시 목록을 생성할 수 있습니다. 데이터베이스의 해시가 목록에 있는 경우 공격자는 일반 텍스트 암호를 알고 있을 것입니다. 그러나 일반 텍스트 암호가 충분히 복잡하게 만들어지면 문제가 되지 않습니다. 또한 해시를 생성하기 위해 일반 텍스트 암호를 수집하는 애플리케이션을 가로챌 수 있습니다.

암호 해싱은 올바른 방향으로 나아가는 훌륭한 단계입니다! 이 기사를 즐기셨기를 바랍니다 :-)