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 bcryptTrướ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ẩuBâ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[]
4Trước hết, chúng ta nên tạo phương thức
class PasswordDatabase:
def __init__[self]:
self.data = dict[]
5class 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ẽ
- 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:
7. Nếu không, nó nên
def __init__[self]:
self.data = dict[] - Băm mật khẩu;
- thêm người dùng và mật khẩu băm vào từ điển;
- trả lại
class PasswordDatabase:
8
def __init__[self]:
self.data = dict[]
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[]
1Bâ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[]
2Bây giờ chúng ta có thể tạo một phương thức
class PasswordDatabase:
def __init__[self]:
self.data = dict[]
9class PasswordDatabase:
def __init__[self]:
self.data = dict[]
4Dò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ạiHã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ôngclass PasswordDatabase:
def __init__[self]:
self.data = dict[]
8Đăng nhập người dùngMộ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ưaclass PasswordDatabase:
def __init__[self]:
self.data = dict[]
0Trướ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 đúngKiể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ôiclass PasswordDatabase:
def __init__[self]:
self.data = dict[]
4Chúng ta có thể kiểm tra nó với các dòng mã sau
class PasswordDatabase:
def __init__[self]:
self.data = dict[]
5Nế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ậnCả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