Python에서 보안 비밀번호 관리자를 구축하는 데 필요한 코드는 다음과 같습니다.
비밀번호 관리는 온라인 안전을위한 가장 중요한 활동 중 하나입니다. 그러나 수백 명 (수백 명이 아닌 경우)의 계정으로 모든 웹 사이트에 대한 새로운 암호를 어떻게 기억하십니까? 암호 관리자가 유용한 곳입니다.
Bitwarden, LastPass 및 1Password와 같은 훌륭한 비밀번호 관리자가 많이 있지만 자신만의 유능한 사이버 보안 프로젝트입니다. 이 블로그 게시물에서는 처음부터 기본적이고 안전한 비밀번호 관리자를 만드는 방법을 보여줍니다.
사이버 보안 학생이든 애호가이든, 또는 일이 어떻게 작동하는지 궁금하든이 튜토리얼은 주요 개념을 설명합니다.
독서 대신 시청하는 것을 선호합니까? 다음은 빠른 비디오 가이드입니다
비밀번호 관리자 란 무엇입니까?
암호 관리자는 다음과 같은 유틸리티입니다.
- 로그인 정보를 저장합니다 (사용자 이름 + 비밀번호).
- 데이터 만 암호화하여 귀하만이 볼 수 있습니다.
- 마스터 비밀번호를 사용하여 비밀번호를 안전하게 읽을 수 있습니다.
하나를 만들 때 보안 + 유용성을 원합니다. 당신은 :
- 데이터를 단단히 저장하십시오.
- 암호화를 사용하십시오.
- 무단 액세스를 차단하십시오.
- 사용하기 간단하게 만듭니다.
기술 스택을 선택하십시오
이 프로젝트를 위해 우리는 사물을 기본적으로 유지하고 사용합니다.
- 파이썬 (프로그래밍 언어)
- sqlite (데이터베이스)
- 암호화 도서관 (암호화 사용)
필수 파이썬 패키지 설치 :
pip install cryptography
암호화 기본 사항을 배우십시오
암호화는 암호 관리자의 가장 중요한 구성 요소입니다.
우리는 암호화 라이브러리에서 Fernet 대칭 암호화를 사용합니다. 작동 방식은 다음과 같습니다.
- 마스터 비밀번호는 키를 만드는 데 사용됩니다.
- 이 키는 암호 입력 암호화 및 암호 해독에 사용됩니다.
KDF (Key Devivation Function), 특히 PBKDF2HMAC를 사용하여 마스터 비밀번호에서 암호화 키를 도출합니다.
마스터 비밀번호 설정
사용자가 앱을 열면 마스터 비밀번호를 요청하십시오. 그것을 사용하여 암호화 키를 도출하십시오.
열쇠를 도출하는 방법은 다음과 같습니다.
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend
import base64
import os
def get_key_from_password(password, salt):
kdf = PBKDF2HMAC(
algorithm=hashes.SHA256(),
length=32,
salt=salt,
iterations=100_000,
backend=default_backend()
)
return base64.urlsafe_b64encode(kdf.derive(password.encode()))
- 소금은 비밀번호를 더 어렵게 만드는 임의의 값입니다.
- 소금을 (파일 또는 데이터베이스에) 저장하고 키를 도출 할 때마다 재사용해야합니다.
암호를 암호화하고 해독합니다
파생 된 키를 사용하여 저장된 비밀번호를 암호화하고 해독합니다.
from cryptography.fernet import Fernet
def encrypt_password(key, password):
fernet = Fernet(key)
return fernet.encrypt(password.encode())
def decrypt_password(key, token):
fernet = Fernet(key)
return fernet.decrypt(token).decode()
sqlite와 함께 데이터 저장
sqlite와 함께, 저장 :
- 웹 사이트 이름
- 사용자 이름
- 암호화 된 비밀번호
데이터베이스 및 테이블 작성 :
import sqlite3
def create_db():
conn = sqlite3.connect('vault.db')
c = conn.cursor()
c.execute('''
CREATE TABLE IF NOT EXISTS passwords (
id INTEGER PRIMARY KEY,
website TEXT NOT NULL,
username TEXT NOT NULL,
password BLOB NOT NULL
)
''')
conn.commit()
conn.close()
비밀번호 저장 및 검색
항목을 저장하는 방법은 다음과 같습니다.
def save_password(website, username, password, key):
encrypted = encrypt_password(key, password)
conn = sqlite3.connect('vault.db')
c = conn.cursor()
c.execute('INSERT INTO passwords (website, username, password) VALUES (?, ?, ?)',
(website, username, encrypted))
conn.commit()
conn.close()
검색 및 해독하려면 :
def get_passwords(key):
conn = sqlite3.connect('vault.db')
c = conn.cursor()
c.execute('SELECT website, username, password FROM passwords')
for row in c.fetchall():
website, username, encrypted_pw = row
decrypted_pw = decrypt_password(key, encrypted_pw)
print(f'Website: {website} | Username: {username} | Password: {decrypted_pw}')
conn.close()
마스터 키와 소금을 보호하십시오
처음으로 마스터 비밀번호를 설정할 때 :
- 임의의 소금을 생성하고 파일 (salt.bin)에 보관하십시오.
- 각 로그인마다 소금을로드하고 키를 도출하십시오.
def load_or_create_salt():
if not os.path.exists('salt.bin'):
salt = os.urandom(16)
with open('salt.bin', 'wb') as f:
f.write(salt)
else:
with open('salt.bin', 'rb') as f:
salt = f.read()
return salt
최종 프로그램 흐름
- 마스터 비밀번호를 자랑합니다.
- 소금을로드하고 키를 도출하십시오.
- 사용자에게 프롬프트 :
- 새 비밀번호를 저장하십시오
- 모든 비밀번호를 얻으십시오
간단한 인터페이스는 다음과 같습니다.
def main():
salt = load_or_create_salt()
master_pw = input("Enter your master password: ")
key = get_key_from_password(master_pw, salt)
while True:
choice = input("1. Save Password\n2. View Passwords\n3. Exit\nChoose: ")
if choice == '1':
site = input("Website: ")
user = input("Username: ")
pw = input("Password: ")
save_password(site, user, pw, key)
elif choice == '2':
get_passwords(key)
else:
break
if __name__ == "__main__":
create_db()
main()
보안 모범 사례
비밀번호 관리자가 정말로 안전하게 만들기 위해 :
- 암호 나 키를 하드 코딩하지 마십시오.
- 항상 민감한 정보를 암호화합니다.
- 비활성의 특정 시간 후에 관리자를 안전하게 잠그십시오.
- 추가 할 수도 있습니다.
- 강도 검사기를 통과하십시오
- Tkinter 또는 Flask를 사용하는 UI
- 내보내기/수입 옵션
- 백업 및 복원
최종 생각
안전한 비밀번호 관리자를 구축하는 것은 재미있는 프로젝트 일뿐 만 아니라 암호화, 보안 저장 및 보안 모범 사례에 대한 적극적인 학습 경험입니다. 직접 사용하거나 학습 목적으로 단순히 구축 할 수 있습니다. 어느 쪽이든 프로젝트는 보안 기본 사항에 대한 지식을 다음 단계로 끌어 올릴 수 있습니다.
전체 소스 코드를 Github Repo로 선호하거나 웹 버전으로 가져 가려면 외침을주십시오. 나는 그것을 더 받아들이는 것을 기꺼이 도와 드리겠습니다!
Post Comment