파이썬 비밀번호 해싱

Salman Mehmood 2024년2월15일
  1. Python의 bcrypt 라이브러리를 사용하는 솔트 및 해시 암호
  2. hashlib 라이브러리를 사용하여 암호 해시
파이썬 비밀번호 해싱

암호 해싱과 bcrypt라는 타사 라이브러리를 사용하여 솔트 및 해시 암호를 암호화하는 방법에 대해 알아봅니다. 또한 Python의 hashlib 라이브러리에서 다양한 해싱 알고리즘을 살펴봅니다.

Python의 bcrypt 라이브러리를 사용하는 솔트 및 해시 암호

해싱은 문자열을 취하여 고정된 길이의 임의의 문자열로 변환하는 프로세스이며 이 프로세스는 되돌릴 수 없습니다. 단방향 함수이므로 메시지를 암호화한 다음 해독할 수 있는 암호화와 같은 원래 문자열로 해시를 반환할 수 없습니다.

해싱은 사용자 관리에 사용됩니다. 예를 들어, 우리가 일반 텍스트 암호를 사용할 때 일부 데이터베이스 위반이 있거나 데이터가 손실되거나 누군가 우리 시스템을 해킹하는 경우입니다. 해싱은 보호 계층을 제공합니다. 그러나 해시된 암호는 적절하게 유지하면 쉽게 해독할 수 없습니다.

이 섹션에서는 bcrypt 모듈을 사용하여 해시된 암호로 작업하는 방법을 살펴봅니다. 계속해서 코드로 이동하겠습니다. 우리는 해싱 알고리즘인 bcrypt라는 타사 라이브러리를 사용할 것입니다.

bcrypt는 암호 해싱을 위한 신뢰할 수 있고 강력하며 권장되는 알고리즘입니다. 그것은 우리가 일을 빨리 끝낼 수 있게 해주는 멋지고 사용하기 쉬운 몇 가지 기능을 제공합니다.

먼저 다음 명령을 사용하여 이 라이브러리를 설치합니다.

pip install bcrypt

이제 bcrypt를 가져와 암호를 만들고 변수에 저장해야 하며 암호는 바이트 문자열이어야 합니다. 이 암호를 해시하기 위해 hashed_pswd라는 새 변수를 만들고 bcrypt에서 hashpw() 메서드를 호출합니다.

두 가지 인수가 필요합니다. 첫 번째는 암호이고 두 번째는 gensalt()라는 것으로 숫자 또는 솔트 및 해시 암호를 무작위로 생성합니다.

import bcrypt

My_pswd = b"Mypassword111"

hashed_pswd = bcrypt.hashpw(My_pswd, bcrypt.gensalt())
print(hashed_pswd)

출력:

b'$2b$12$KEW01pYNDc3ee9U0wZpmgOBpUvvjkig/qxs593hGh/aZ2AvvGTyWu'

hashlib 라이브러리를 사용하여 암호 해시

이 섹션에서는 hashlib 라이브러리를 사용하여 솔트 및 해시 비밀번호를 생성합니다. 비밀번호와 같은 보안 데이터를 한 위치에서 다른 위치로 전달하는 경우 다른 사람이 읽을 수 없도록 하는 것이 좋습니다.

무언가를 숨기거나 사용자가 읽을 수 없게 만들고 싶을 때 할 수 있는 두 가지 유형이 있습니다. 첫 번째는 해싱이고 두 번째는 암호화입니다. 암호화는 대부분 암호에 사용되지 않습니다.

컴퓨터에서 다른 컴퓨터로 파일을 전송하거나 파일을 보내려면 암호화를 사용합니다. 그러나 암호가 올바른지 확인하거나 서버에 암호를 저장하려는 경우 대부분 해싱이 사용됩니다.

hashlib 라이브러리의 가장 좋은 점은 아무것도 설치할 필요가 없다는 것입니다. Python 3 또는 최신 버전과 함께 제공됩니다. hashlib를 가져온 후 MD5_Algo라는 객체를 만들고 hashlib에서 md5()를 호출합니다.

md5는 일종의 해싱 알고리즘이고 mdmessage-digest를 나타내며 5는 버전입니다. 이제 일반 텍스트를 해싱으로 변환할 문자열이 필요하며 이를 위해 update() 메서드를 호출하고 해시하려는 문자열을 작성합니다.

그런 다음 print() 함수 내에서 hexdigest() 메서드를 호출합니다. 스트레인을 실제 md5로 변환한 후 16진수 형식으로 변환합니다.

import hashlib

MD5_Algo = hashlib.md5()
MD5_Algo.update("hello")
print(MD5_Algo.hexdigest())

이 코드 조각은 오류를 발생시킵니다(유니코드 개체는 해싱 전에 인코딩해야 함). 위 섹션에서 문자열을 바이트로 변환해야 한다고 이미 논의했습니다.

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_4064/2416014515.py in <module>
      2
      3 MD5_Algo=hashlib.md5()
----> 4 MD5_Algo.update('hello')
      5 print(MD5_Algo.hexdigest())

TypeError: Unicode-objects must be encoded before hashing

문자열을 바이트로 변환한 후 md5로 암호화된 해시된 비밀번호를 제공하는 것을 볼 수 있습니다.

import hashlib

MD5_Algo = hashlib.md5()
MD5_Algo.update(b"hello")
print(MD5_Algo.hexdigest())

출력:

5d41402abc4b2a76b9719d911017c592

hashlib.sha512()

다른 종류의 암호화된 해시도 있습니다. 실제로 Python 내부에 어떤 종류의 해싱 항목이 있는지 알아봅시다. algorithms_available 속성을 사용하여 사용 가능한 알고리즘을 출력할 수 있습니다.

print(hashlib.algorithms_available)

출력:

{'md4', 'md5', 'shake_256', 'shake_128', 'sha512_224', 'md5-sha1', 'sha224', 'sha3_512', 'sha1', 'sha3_384', 'sha512', 'sha3_224', 'sha512_256', 'sha384', 'sha256', 'blake2b', 'sha3_256', 'blake2s', 'ripemd160', 'whirlpool', 'sm3', 'mdc2'}

우리가 볼 수 있듯이 멋진 알고리즘이 많이 있으며 분명히 이러한 모든 객체는 동일한 종류의 구조를 가지고 있으며 동일한 기능과 변수를 갖지만 다른 알고리즘일 뿐입니다.

sha512는 우리가 사용하고 문자열로 전달할 것입니다. 그 후 해싱될 해당 문자열에 hexdigest()를 사용합니다.

import hashlib

MD5_Algo = hashlib.sha512(b"hello")
print(MD5_Algo.hexdigest())

이 코드를 실행하면 긴 문자 덩어리를 얻게 됩니다.

9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043

sha512sha1보다 더 강하고 좋습니다. 그것은 모두 상황에서 더 좋거나 가장 좋은 것으로 결정한 시나리오에 따라 다릅니다.

솔팅 및 해싱

이러한 종류의 오래된 알고리즘의 문제점은 무차별 대입(brute-force) 또는 리버스 엔지니어링(reverse-engineered)될 수 있다는 것입니다. 모든 사람이 이 암호화된 해시를 쉽게 해독할 수 있기 때문에 안전하지 않습니다. 암호화된 해시는 hello입니다. 사전 공격을 수행하고 sha512 사전에서 암호를 해독하면 어떻게 될까요?

sha512

sha512의 몰락은 많은 사람들이 Facebook 또는 기타 애플리케이션에서 비밀번호를 사용한다는 것입니다. 보통은 sha512에서 이미 반전된 생일을 사용하기 때문에 안전한 방법이 아닙니다.

가장 안전한 방법 중 하나는 소금에 절이는 것입니다. 솔팅은 원래 문자열 앞에 일부 문자를 추가합니다. "hello" 앞에 "a"를 추가하면 원래 문자열 앞에 소금으로 "a"라는 문자를 추가한 것입니다.

hashlib.sha512(b"helloa")

이제 우리는 이 여분의 소금으로 이 해시를 암호화했습니다. 그래서 해시를 해독하는 방법을 알아내려는 해커와 다른 사람들에게 매우 어려울 것입니다. 그래서 소금이 들어오는 곳입니다.

hashlib.pbkdf2_hmac()

Python에서 hashlib 라이브러리에는 약간 느리지만 pbkdf2_hmac()이라는 꽤 좋은 기능이 있습니다. 우리는 이 함수를 사용할 것이고 두 번째 라이브러리는 실제로 바이너리를 ASCII 문자로 변환하기 위한 것입니다.

pbkdf2_hmac()에는 몇 가지 매개변수가 필요합니다. 첫 번째 매개변수는 우리가 사용할 알고리즘의 이름이므로 이 경우 sha512를 사용합니다. 다음은 암호 또는 해시하려는 텍스트입니다. 이 경우 "hello"가 됩니다.

다음 암호는 솔트이며 이 암호에 솔트가 추가된 다음 sha512를 사용하여 암호화됩니다. 마지막은 반복 횟수입니다. 이 반복을 수십만 번 수행하면 암호를 해독하기가 매우 어려울 것입니다.

코드의 마지막 줄에서 binascii 라이브러리의 hexlify() 메서드를 사용하여 암호화된 해시를 ASCII 문자로 변환합니다.

import hashlib
import binascii

Enc_Salt = hashlib.pbkdf2_hmac("sha512", b"hello", b"a", 100000)
print(binascii.hexlify(Enc_Salt))

출력:

b'40b5957a2d2f5aebcdd878a04e644215d4f3aba3f11c00a1f24e75f8ea2efa11611b2a923a9050832cb768a3a3ad282011cab524b741d392c664b8efbb5f389f'

이제 sha512 사전이 해독할 수 없음을 알 수 있습니다.

sha512는 해독할 수 없습니다

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn