Lưu trữ an toàn Python

Khi lưu trữ mật khẩu, một trong những rủi ro lớn nhất là ai đó có thể đánh cắp cơ sở dữ liệu và có thể giải mã chúng. Để tránh điều này, bạn phải luôn băm mật khẩu trước khi lưu trữ chúng

Trong bài viết này, tôi sẽ chỉ cho bạn cách làm điều này trong Python bằng thư viện bcrypt

Đang cài đặt bcrypt

Trước hết, chúng ta cần cài đặt bcrypt bằng pip

pip install bcrypt

Đó là một thông lệ tốt [mặc dù không bắt buộc] để tạo một môi trường ảo mới cho dự án này. Nếu bạn muốn tìm hiểu thêm về điều này, hãy xem bài viết sau

Cách tạo và quản lý môi trường ảo trong Python

Tạo môi trường ảo cho Python trong Windows [và Unix]

con trăn. tiếng Anh đơn giản. io

Băm mật khẩu là gì?

Trước hết, điều quan trọng là phải biết lý thuyết đằng sau hàm băm

Hàm băm là một hàm lấy một chuỗi byte và "biến đổi" nó thành một chuỗi byte khác, từ đó không thể xác định được chuỗi ban đầu. Hơn nữa, không có hai đầu vào khác nhau cho cùng một đầu ra

Điều này có nghĩa là nếu chúng tôi lưu trữ mật khẩu đã băm, ngay cả khi ai đó đánh cắp cơ sở dữ liệu, họ sẽ không thể xác định được mật khẩu văn bản thuần túy là gì

Bây giờ, giả sử rằng người dùng đã đăng ký bằng mật khẩu

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
6. Sau đó để thực hiện đăng nhập, chúng ta cần kiểm tra xem mật khẩu do người dùng viết có giống với mật khẩu được lưu trữ hay không

Để làm như vậy, chúng ta chỉ cần băm mật khẩu được sử dụng để đăng nhập, sau đó kiểm tra xem hàm băm này có tương ứng với mật khẩu được lưu trữ hay không. Vì theo định nghĩa của hàm băm, không có hai đầu vào khác nhau cho cùng một đầu ra, hai giá trị băm sẽ chỉ bằng nhau nếu mật khẩu do người dùng viết giống với mật khẩu được sử dụng trong quá trình đăng ký

Điểm yếu duy nhất là nếu mật khẩu ngắn, kẻ tấn công có thể cố gắng băm tất cả các mật khẩu có thể cho đến khi tìm được mật khẩu chính xác. Tuy nhiên, điều này khó xảy ra nếu mật khẩu đủ dài vì có quá nhiều tổ hợp. Nhưng làm thế nào để đảm bảo rằng mật khẩu dài?

Thông thường, trước khi băm mật khẩu, chúng tôi sẽ thêm muối, tôi. e. một chuỗi ký tự ngẫu nhiên. Bằng cách này, chúng tôi biết rằng ngay cả khi người dùng sử dụng mật khẩu ngắn thì mật khẩu đó vẫn được bảo mật

Tạo cơ sở dữ liệu mật khẩu

Bây giờ chúng ta đã thấy ý tưởng đằng sau hàm băm, hãy xem cách nó hoạt động trong Python. Chúng tôi sẽ tạo một lớp

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
0 , lớp này sẽ triển khai phương thức
class PasswordDatabase:
def __init__[self]:
self.data = dict[]
1 để thêm người dùng mới và
class PasswordDatabase:
def __init__[self]:
self.data = dict[]
2 trả về true nếu người dùng
class PasswordDatabase:
def __init__[self]:
self.data = dict[]
3 được đăng ký bằng mật khẩu
class PasswordDatabase:
def __init__[self]:
self.data = dict[]
4

Trước hết, chúng ta nên tạo phương thức

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
5

class PasswordDatabase:
def __init__[self]:
self.data = dict[]

Đây

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
6 là từ điển lưu trữ tên người dùng và mật khẩu. tên người dùng được sử dụng làm khóa của từ điển

Đăng ký người dùng mới

Bây giờ hãy tạo chức năng để đăng ký người dùng mới. Nó sẽ

  1. Kiểm tra xem người dùng đã đăng ký chưa và nếu trường hợp này xảy ra, hãy trả lại
    class PasswordDatabase:
    def __init__[self]:
    self.data = dict[]
    7. Nếu không, nó nên
  2. Băm mật khẩu;
  3. thêm người dùng và mật khẩu băm vào từ điển;
  4. trả lại
    class PasswordDatabase:
    def __init__[self]:
    self.data = dict[]
    8

Bước đầu tiên rất dễ thực hiện. chúng ta chỉ cần kiểm tra xem tên người dùng đã có trong từ điển chưa

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
1

Bây giờ chúng ta cần băm mật khẩu. Đây là nơi bcrypt đến để giúp chúng tôi

Trước hết, chúng ta cần nhập nó

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
2

Bây giờ chúng ta có thể tạo một phương thức

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
9

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
4

Dòng đầu tiên là chuyển đổi mật khẩu [là một chuỗi] thành một chuỗi byte. Trên thực tế, các hàm bcrypt sẽ hoạt động trên các chuỗi byte, không phải trên các chuỗi

Sau đó, chúng tôi tạo muối cho mật khẩu bằng cách sử dụng

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
10. Cuối cùng, chúng ta có thể tạo hàm băm từ byte mật khẩu và muối và trả lại

Hãy quay lại hàm

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
11. Ở đây chúng ta cần gọi phương thức
class PasswordDatabase:
def __init__[self]:
self.data = dict[]
9 mà chúng ta vừa tạo, sau đó lưu tên người dùng và hàm băm vào từ điển. Hàm trả về True vì một người dùng mới đã được lưu thành công

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
8Đăng nhập người dùng

Một phương thức khác mà lớp

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
13 cần là phương thức để thực hiện đăng nhập. Thao tác này sẽ lấy tên người dùng và mật khẩu làm đầu vào, sau đó kiểm tra xem người dùng có tên người dùng và mật khẩu đã cho đã được đăng ký chưa

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
0

Trước hết, chúng ta cần trả về false nếu tên người dùng không có trong cơ sở dữ liệu

Sau đó, chúng ta có thể kiểm tra xem mật khẩu được cung cấp làm đầu vào có tương ứng với hàm băm được lưu trong cơ sở dữ liệu không. Như trước đây, chúng ta cần chuyển đổi chuỗi mật khẩu thành byte bằng cách sử dụng hàm

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
14. Sau đó, chúng ta có thể gọi hàm
class PasswordDatabase:
def __init__[self]:
self.data = dict[]
15. Điều này lấy làm đối số mật khẩu [tính bằng byte] và hàm băm. Sau đó, nó trả về true khi và chỉ khi mật khẩu đúng

Kiểm tra mã

Đây là mã hoàn chỉnh của

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
0 của chúng tôi

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
4

Chúng ta có thể kiểm tra nó với các dòng mã sau

class PasswordDatabase:
def __init__[self]:
self.data = dict[]
5

Nếu mọi thứ hoạt động chính xác, chức năng đăng ký cuối cùng sẽ trả về false, vì đã tồn tại người dùng có tên “john”

Sau đó, khi đăng nhập người dùng, chỉ cuộc gọi cuối cùng mới trả về true. nó là cái duy nhất có cả tên người dùng và mật khẩu đều đúng

Phần kết luận

Cảm ơn bạn đã đọc đến cuối. Nếu bạn muốn tìm hiểu thêm về thư viện bcrypt, đây là một số liên kết hữu ích

mã hóa Python

sửa đổi lần cuối ngày 29 tháng 11 năm 2021 Hướng dẫn bcrypt Python chỉ ra cách băm mật khẩu trong Python bằng thư viện bcrypt…

mã số. com

Băm mật khẩu trong Python. Hướng dẫn Bcrypt với các ví dụ. HackerBuổi trưa

Xây dựng một máy chủ từ đầu hoặc sử dụng một khung nhẹ đang trao quyền. Cùng với quyền lực đó là trách nhiệm…

hackernoon. com

Thêm nội dung bằng tiếng Anh. io. Đăng ký nhận bản tin hàng tuần miễn phí của chúng tôi. Nhận quyền truy cập độc quyền để viết các cơ hội và lời khuyên trong cộng đồng của chúng tôi Discord

Chủ Đề