Hướng dẫn how do i hash a password using bcrypt in python? - làm cách nào để băm mật khẩu bằng bcrypt trong python?

Giới thiệu

Lưu trữ mật khẩu một cách an toàn phải là bắt buộc đối với bất kỳ kỹ sư đáng tin cậy nào. Mật khẩu văn bản thuần túy cực kỳ không an toàn - bạn thậm chí không nên xem xét việc lưu trữ chúng một định dạng đơn giản. Đủ để ai đó đạt được các đặc quyền xem trên cơ sở dữ liệu cho toàn bộ cơ sở người dùng bị xâm phạm.

Mật khẩu phải được lưu trữ theo cơ sở dữ liệu theo cách an toàn nhưng có thể quản lý được.

Bạn nên luôn luôn cho rằng cơ sở dữ liệu của bạn sẽ bị xâm phạm và thực hiện tất cả các biện pháp phòng ngừa cần thiết để ngăn chặn bất kỳ ai, những người có thể nắm giữ dữ liệu của bạn, khai thác nó theo bất kỳ cách nào có thể. Điều đó đặc biệt đúng đối với cơ sở dữ liệu lưu trữ thông tin đăng nhập của người dùng hoặc dữ liệu nhạy cảm khác.will be compromised and take all necessary precautions to prevent anyone, who could get hold of your data, from exploiting it in any way possible. That is especially true for databases that store users' login credentials or other sensitive data.

Ngoài ra - đó là một câu hỏi về hành vi đạo đức. Nếu người dùng đăng nhập cho trang web của bạn - bạn có thể tìm thấy nguyên văn quảng cáo mật khẩu của họ không? Mật khẩu thường được sử dụng trên nhiều trang web, chứa thông tin cá nhân và/hoặc có thể phơi bày một bên của người dùng mà họ không muốn đưa ra công khai. Cả bạn và một diễn viên độc hại đều không thể đọc mật khẩu văn bản đơn giản tại bất kỳ điểm nào. Đây là lý do tại sao các trang web không thể gửi email cho bạn mật khẩu của bạn khi bạn quên nó - họ không biết điều đó. Bạn phải đặt lại nó.you nor a malicious actor should be able to read a plain-text password at any point. This is why websites can't email you your password when you forget it - they don't know it. You have to reset it.

Mật khẩu băm là một quy trình rẻ, an toàn và tiêu chuẩn, giữ cho mật khẩu an toàn khỏi cả người quản trị trang web và các diễn viên độc hại.

Để ngăn chặn bất kỳ ai khai thác một cách trắng trợn thông tin đăng nhập, bạn nên luôn luôn băm mật khẩu trước khi lưu trữ chúng trong cơ sở dữ liệu. Đó là cách đơn giản nhất, nhưng hiệu quả nhất để ngăn chặn việc sử dụng mật khẩu trái phép được lưu trữ trong cơ sở dữ liệu của bạn. Ngay cả khi ai đó nắm giữ thông tin đăng nhập của người dùng, thông tin đó không thể được sử dụng ở bất kỳ hình dạng hoặc hình thức nào, vì định dạng không thể đọc được đối với con người và khó có thể tính toán tính toán.always hash passwords before storing them in a database. That is the simplest, yet most effective way to prevent the unauthorized use of passwords stored in your database. Even if someone gets a hold of users' login credentials, that information can't be used in any shape or form, since the format is unreadable for humans, and hard to crack computationally.

Trong hướng dẫn này, chúng tôi sẽ giải thích cách băm mật khẩu của bạn trong Python bằng BCRYPT. Chúng tôi sẽ bao gồm những gì băm là, các băm được so sánh như thế nào, hoạt động của "muối" như thế nào và làm thế nào băm thậm chí làm cho mật khẩu an toàn.

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

Ở dạng cơ bản nhất của nó, băm đề cập đến việc chuyển đổi một chuỗi sang một chuỗi khác (còn được gọi là băm) bằng hàm băm. Bất kể kích thước của chuỗi đầu vào, băm sẽ có kích thước cố định được xác định trước trong chính thuật toán băm. Mục tiêu là băm không trông giống như chuỗi đầu vào và bất kỳ thay đổi nào trong chuỗi đầu vào tạo ra sự thay đổi trong băm.

Ngoài ra - các hàm băm đầu vào băm theo kiểu một chiều. Đó không phải là một chuyến đi khứ hồi và một mật khẩu băm không thể không bị ảnh hưởng. Cách duy nhất để kiểm tra xem mật khẩu đầu vào có khớp với cái trong cơ sở dữ liệu hay không là băm mật khẩu đầu vào, sau đó so sánh các băm. Bằng cách này, chúng ta không cần biết mật khẩu thực tế là gì để xác định xem nó có khớp với cái nào trong cơ sở dữ liệu hay không.

Lưu ý: Trong hướng dẫn này, chúng tôi sẽ sử dụng thuật ngữ "hàm băm" cho hàm toán học được sử dụng để tính toán băm có kích thước cố định dựa trên chuỗi đầu vào (các hàm băm phổ biến bao gồm SHA256, SHA1, MD5, CRC32, BCRYPT, v.v.) . Một "thuật toán băm" đề cập đến toàn bộ quá trình băm, bao gồm không chỉ một hàm băm được sử dụng mà còn nhiều tham số có thể được thay đổi trong quá trình băm. In this guide, we'll use the term "hashing function" for a mathematical function used to calculate the fixed-size hash based on the input string (popular hashing functions include SHA256, SHA1, MD5, CRC32, BCrypt etc.). A "hashing algorithm" refers to the whole process of hashing, including not only a hashing function used but many more parameters that can be altered during the process of hashing.

Mỗi khi bạn đặt một cái gì đó như "myPwd" vào thuật toán băm, bạn sẽ nhận được cùng một đầu ra chính xác. Nhưng, nếu bạn thay đổi "myPwd" thậm chí một chút, đầu ra sẽ được thay đổi ngoài sự công nhận.

Điều đó đảm bảo rằng ngay cả các chuỗi đầu vào tương tự cũng tạo ra các băm hoàn toàn khác nhau. Nếu mật khẩu tương tự được tạo ra cùng một băm - bẻ khóa một mật khẩu đơn giản có thể dẫn đến việc tạo bảng tra cứu cho các ký tự khác. Mặt khác, vì cùng một đầu vào luôn mang lại cùng một đầu ra, một băm là khá dễ đoán.

Khả năng dự đoán là dễ dàng khai thác.

Nếu ai đó biết hàm băm nào đã được sử dụng để băm một mật khẩu nhất định (và không có một danh sách lớn các hàm băm đang sử dụng), chúng có thể bẻ khóa nó bằng cách đoán tất cả các mật khẩu có thể, băm chúng với cùng một hàm băm và so sánh Băm vào băm của mật khẩu mà họ muốn bẻ khóa. Loại tấn công này được gọi là một cuộc tấn công vũ phu và cuộc tấn công được sử dụng để hoạt động rất tốt cho các mật khẩu đơn giản, chẳng hạn như

$ sudo apt-get install build-essential libffi-dev python-dev
1,
$ sudo apt-get install build-essential libffi-dev python-dev
2, v.v.

Cách dễ nhất để ngăn chặn các cuộc tấn công vũ phu là sử dụng hàm băm tương đối chậm để tính toán. Bằng cách đó, cuộc tấn công vũ phu sẽ mất rất nhiều thời gian để tính toán tất cả các băm có thể, đến nỗi nó thậm chí không đáng để cố gắng thực hiện.

Ngoài ra, hầu hết các ứng dụng web đều có "thời gian chờ" tích hợp sau khi một số lượng mật khẩu không chính xác nhất định được nhập vào Ai đó có được một bản sao cục bộ của mật khẩu băm.

Muối trong mật khẩu là gì?

Là mật mã, giá mỗi tính toán và nâng cao công nghệ - chỉ cần chọn một hàm băm thích hợp không đủ để bảo mật mật khẩu được lưu trữ trong cơ sở dữ liệu. Trong một số trường hợp, ngay cả một chức năng băm tuyệt vời cũng không thể ngăn chặn một cuộc tấn công. Do đó, bạn nên thực hiện các biện pháp phòng ngừa bổ sung để làm cho việc bẻ khóa mật khẩu được lưu trữ trở nên khó khăn hơn.

Vấn đề với băm là đầu ra (nghĩa là băm) luôn giống nhau cho cùng một đầu vào. Điều đó làm cho băm có thể dự đoán được, do đó dễ bị tổn thương. Bạn có thể giải quyết rằng bằng cách chuyển một chuỗi ngẫu nhiên bổ sung cùng với chuỗi đầu vào khi thực hiện băm. Điều đó sẽ đảm bảo rằng băm không còn tạo ra cùng một đầu ra mỗi khi nó có cùng chuỗi với đầu vào.

Chuỗi giả có độ dài cố định đó được truyền bên cạnh chuỗi đầu vào khi thực hiện băm được gọi là muối. Mỗi khi bạn muốn lưu trữ mật khẩu trong cơ sở dữ liệu, một loại muối mới, ngẫu nhiên, sẽ được tạo và truyền cùng với mật khẩu cho hàm băm. Do đó, ngay cả khi hai người dùng có cùng một mật khẩu, bản ghi của nó trong cơ sở dữ liệu sẽ hoàn toàn khác nhau.

Hãy nhớ rằng việc thêm một ký tự duy nhất vào cuối chuỗi trước khi băm thay đổi hoàn toàn băm.

Muối được sử dụng để tạo mật khẩu được lưu trữ riêng biệt và được thêm vào bất kỳ đầu vào mới nào được băm và so sánh với băm được lưu trữ trong cơ sở dữ liệu, đảm bảo rằng ngay cả khi bổ sung các yếu tố ngẫu nhiên - người dùng có thể đăng nhập bằng cách sử dụng mật khẩu tương ứng của họ . Quan điểm của muối không phải là làm cho việc tính toán một mật khẩu không khả thi hơn nhiều về mặt tính toán - đó là để ngăn chặn sự tương đồng giữa các chuỗi băm và để ngăn kẻ tấn công bẻ khóa nhiều mật khẩu nếu chúng giống nhau.

Thông qua Salting - Các hoạt động cực kỳ tốn kém về mặt tính toán được định vị thành một trường hợp duy nhất và phải lặp lại cho mọi mật khẩu trong cơ sở dữ liệu, ngăn chặn một loạt bảo mật bị hỏng.extremely computationally expensive operations are localized to a single instance and have to be repeated for every password in the database, stopping a cascade of broken security.

Rất may - toàn bộ logic này thường được trừu tượng hóa bởi các khung và mô -đun bảo mật mà chúng ta có thể dễ dàng sử dụng trong mã.

Bcrypt là gì?

BCRYPT là một thuật toán băm mật khẩu, được thiết kế với tất cả các biện pháp phòng ngừa bảo mật mà chúng tôi đã đề cập trong tâm trí. Nó được sử dụng làm thuật toán băm mật khẩu mặc định trong OpenBSD, một hệ điều hành tập trung vào bảo mật nguồn mở và là thuật toán băm được hỗ trợ rộng rãi nhất cho đến nay.

BCRYPT được coi là khá an toàn. Hàm băm của nó dựa trên thuật toán cá thổi (mật mã), thực hiện muối và tốc độ tính toán thích nghi. Tốc độ thích ứng đề cập đến khả năng tăng độ phức tạp của giá trị băm tính, trong tương lai bằng chứng cho thuật toán. Nó tiếp tục đủ chậm để ngăn chặn các cuộc tấn công vũ phu bất kể tốc độ tính toán ngày càng tăng của phần cứng.Blowfish (cipher) algorithm, implements salting and adaptive computation speed. Adaptive speed refers to the ability to increase the complexity of calculating hash value, which future proofs the algorithm. It keeps being slow enough to prevent brute-force attacks no matter the increasing computing speed of the hardware.

BCRYPT được hỗ trợ và triển khai rộng rãi trong hầu hết các ngôn ngữ chính thống. Có các triển khai có sẵn công khai cho Java, JavaScript, C, C ++, C#, GO, Perl, PHP, v.v.

Cách băm mật khẩu bằng python bằng bcrypt

Mô -đun

$ sudo apt-get install build-essential libffi-dev python-dev
3 trên PYPI cung cấp một triển khai BCRYPT tuyệt vời mà chúng tôi có thể dễ dàng cài đặt thông qua
$ sudo apt-get install build-essential libffi-dev python-dev
4:

$ pip install bcrypt

Lưu ý: Để đảm bảo rằng tất cả các phụ thuộc cần thiết được cài đặt, tài liệu chính thức khuyên bạn nên chạy các lệnh sau dựa trên hệ điều hành mà bạn chọn.
To make sure that all required dependencies are installed, the official documentation advises you to run the following commands based on your operating system of choice.

Dành cho Debian và Ubuntu:

$ sudo apt-get install build-essential libffi-dev python-dev

Đối với Fedora và Rhel-Derivative:

$ sudo yum install gcc libffi-devel python-devel

Kiểm tra hướng dẫn thực hành của chúng tôi, thực tế để học Git, với các thực hành tốt nhất, các tiêu chuẩn được công nghiệp chấp nhận và bao gồm bảng gian lận. Ngừng các lệnh git googling và thực sự tìm hiểu nó!

Cho Alpine:

$ apk add --update musl-dev gcc libffi-dev

Sau khi bạn đã cài đặt BCRYPT bằng

$ sudo apt-get install build-essential libffi-dev python-dev
4, bạn có thể nhập nó vào dự án của mình:

import bcrypt

Để băm mật khẩu của bạn bằng bcrypt, trước tiên bạn phải chuyển đổi nó thành mảng byte. Để đạt được điều đó, chúng ta có thể sử dụng phương pháp

$ sudo apt-get install build-essential libffi-dev python-dev
6 của lớp
$ sudo apt-get install build-essential libffi-dev python-dev
7! Nó sẽ mã hóa phiên bản chuỗi của mật khẩu bạn muốn băm vào một mảng byte, được đưa ra một loại mã hóa nhất định và làm cho có thể băm bằng bcrypt.

Hãy lấy

$ sudo apt-get install build-essential libffi-dev python-dev
8 làm mật khẩu ví dụ để minh họa việc sử dụng bcrypt:

pwd = 'MyPassWord'

bytePwd = password.encode('utf-8')

Phương thức

$ sudo apt-get install build-essential libffi-dev python-dev
6 lấy một chuỗi trong một số mã hóa (ví dụ: ASCII, UTF-8, v.v.) và chuyển đổi nó thành một mảng byte tương ứng. Đó là mảng byte hình thành của một chuỗi được gọi là chuỗi B.

Lưu ý: Trong ví dụ trước,

$ sudo yum install gcc libffi-devel python-devel
0 là một chuỗi và
$ sudo yum install gcc libffi-devel python-devel
1 là một mảng byte. Nhưng nếu bạn in cả hai biến, sự khác biệt có thể nhìn thấy duy nhất là
$ sudo yum install gcc libffi-devel python-devel
1 có
$ sudo yum install gcc libffi-devel python-devel
3 như một tiền tố trước giá trị của nó -
$ sudo yum install gcc libffi-devel python-devel
4. Từ đó tên của loại mảng byte đó-một chuỗi B.
In the previous example,
$ sudo yum install gcc libffi-devel python-devel
0 is a string and
$ sudo yum install gcc libffi-devel python-devel
1 is a byte-array. But if you print both variables, the only visible difference is that the
$ sudo yum install gcc libffi-devel python-devel
1 has
$ sudo yum install gcc libffi-devel python-devel
3 as a prefix before its value -
$ sudo yum install gcc libffi-devel python-devel
4. Thence the name of that type of byte-array - a b-string.

Cuối cùng, bạn có thể băm mật khẩu được mã hóa bằng bcrypt:

# Generate salt
mySalt = bcrypt.gensalt()

# Hash password
hash = bcrypt.hashpw(bytePwd, mySalt)

Như bạn có thể thấy, phương pháp được sử dụng để băm trong bcrypt là

$ sudo yum install gcc libffi-devel python-devel
5. Phải mất hai đối số, biểu diễn chuỗi B của mật khẩu và muối. Rõ ràng, bạn có thể tự tạo một loại muối, nhưng chắc chắn nên sử dụng
$ sudo yum install gcc libffi-devel python-devel
6Method thay thế. Đó là một phương pháp bcrypt được tạo ra đặc biệt để tạo muối theo kiểu bảo mật bằng mật mã.

Lưu ý: Tốc độ tính toán thích ứng trong BCRYPT đạt được bằng cách đặt một số lần lặp cần thiết để tạo muối. Giá trị đó được thông qua như là đối số của

$ sudo yum install gcc libffi-devel python-devel
6Method. Giá trị mặc định là 12, có nghĩa là BCRYPT sử dụng các lần lặp 212 (4096) để tạo muối. Bằng cách tăng giá trị của đối số đó, bạn tăng số lần lặp được sử dụng để tạo muối và bằng cách mở rộng, thời gian cần thiết để tính toán băm. Adaptive computation speed in BCrypt is achieved by setting a number of iterations needed to create a salt. That value is passed as the argument of the
$ sudo yum install gcc libffi-devel python-devel
6method. The default value is 12, meaning that BCrypt uses 212 (4096) iterations to generate a salt. By increasing the value of that argument, you increase the number of iterations used to generate a salt, and by extension, the time needed to compute the hash.

Bây giờ,

$ sudo yum install gcc libffi-devel python-devel
8 đang lưu trữ phiên bản băm của mật khẩu
$ sudo yum install gcc libffi-devel python-devel
0.
$ sudo yum install gcc libffi-devel python-devel
8 sẽ trông hơi giống với:

b'$2b$12$1XCXpgmbzURJvo.bA5m58OSE4qhe6pukgSRMrxI9aNSlePy06FuTi'

Không giống với mật khẩu gốc, phải không? Nhưng nếu bạn so sánh

$ sudo yum install gcc libffi-devel python-devel
8 với mật khẩu ban đầu bằng phương thức
$ apk add --update musl-dev gcc libffi-dev
2 của BCrypt, nó sẽ trả về giá trị
$ apk add --update musl-dev gcc libffi-dev
3!

Lưu ý: Phương pháp

$ apk add --update musl-dev gcc libffi-dev
2 được thiết kế để xác thực mật khẩu băm. Nó băm mật khẩu đầu vào mới, thêm muối mà nó tự động theo dõi và sau đó so sánh kết quả. The
$ apk add --update musl-dev gcc libffi-dev
2 method is designed for validating hashed passwords. It hashes the new input password, adds the salt it automatically tracks, and then compares the results.

Chúng ta hãy kiểm tra xem có phải văn bản theo nghĩa đen

$ apk add --update musl-dev gcc libffi-dev
5 có phải là mật khẩu hợp lệ cho
$ sudo yum install gcc libffi-devel python-devel
8 mới mà chúng ta vừa tạo không:

print(bcrypt.checkpw(password, hash))
# Output: True

Các thành phần của đầu ra bcrypt

Như chúng ta đã thấy trong ví dụ trước, đầu vào của BCRYPT là mật khẩu (tối đa 72 byte) và muối (với số lần lặp liên quan) và đầu ra là hàm băm 24 byte.

Hãy xem xét hình minh họa sau đây để hiểu được cách bcrypt xây dựng băm được sản xuất:

Minh họa này cho thấy một băm mật khẩu,

$ apk add --update musl-dev gcc libffi-dev
7, do đó, nó minh họa băm từ phần trước.

Như chúng ta đã thảo luận trước đây, mỗi lần bạn gọi phương thức

$ sudo yum install gcc libffi-devel python-devel
6, nó sẽ tạo ra một mảng byte có kích thước cố định mới (được đại diện bởi một chuỗi B). Trong ví dụ này, phương pháp
$ sudo yum install gcc libffi-devel python-devel
6 đã tạo ra đầu ra được đánh dấu là
import bcrypt
0 trong hình minh họa. Hãy phân tách phần
import bcrypt
0 và giải thích từng tiểu mục riêng lẻ.

import bcrypt
0 có ba tiểu mục chia cho dấu hiệu
import bcrypt
3:

  • Phiên bản BCRYPT Một định danh thuật toán băm đặc biệt - trong trường hợp này là

    import bcrypt
    
    4 - phiên bản mới nhất của thuật toán BCRYPT.
    A special hashing algorithm identifier - in this case
    import bcrypt
    
    4 - the newest version of the BCrypt algorithm.

  • số mũ đối số của phương pháp

    $ sudo yum install gcc libffi-devel python-devel
    
    6 đại diện cho số lần lặp được sử dụng để tính một muối. Nếu không có đối số nào được thông qua, giá trị mặc định là 12, do đó, 212 lần lặp được sử dụng để tính một muối.
    The argument of the
    $ sudo yum install gcc libffi-devel python-devel
    
    6 method representing the number of iterations used to compute a salt. If no argument is passed, the default value is 12, therefore 212 iterations are used to compute a salt.

  • tạo ra muối một mã hóa radix-64 của muối được tạo ra được biểu thị bởi 22 ký tự.
    A radix-64 encoding of the generated salt represented by 22 characters.

Sau đó, bcrypt dính vào

import bcrypt
0 cùng với giá trị băm là
import bcrypt
7 và do đó tạo ra
$ sudo yum install gcc libffi-devel python-devel
8 cuối cùng của
import bcrypt
7.

Lưu ý: Giá trị băm của

import bcrypt
7 (hoặc bất kỳ mật khẩu nào khác) đề cập đến mã hóa Radix-64 của 23 byte đầu tiên của băm 24 byte. Nó được đại diện bởi 31 ký tự. The hashed value of
import bcrypt
7 (or any other password) refers to a radix-64 encoding of the first 23 bytes of the 24-byte hash. It is represented by 31 characters.

Sự kết luận

Sau khi đọc bài viết này, bạn sẽ có một sự hiểu biết vững chắc về cách sử dụng bcrypt để băm mật khẩu trước khi lưu trữ nó vào cơ sở dữ liệu. Để đặt mọi thứ vào một viễn cảnh, chúng tôi đã giải thích thuật ngữ cơ bản theo nghĩa chung và sau đó minh họa quá trình băm mật khẩu trên ví dụ về bcrypt.

Làm thế nào để tôi băm với bcrypt?

Cách sử dụng BCrypt để băm và xác minh mật khẩu..
Bước 1: Cài đặt BCRYPT. Sử dụng NPM: NPM Cài đặt BCRYPT. ....
Bước 2: Nhập bcrypt. const bcrypt = yêu cầu ("bcrypt").
Bước 3: Tạo muối. Để tạo muối, hãy gọi bcrypt. ....
Bước 4: Hé mật khẩu. ....
Bước 5: So sánh mật khẩu bằng BCRYPT ..

Làm cách nào để mã hóa một bcrypt trong python?

Để băm mật khẩu của bạn bằng bcrypt, trước tiên bạn phải chuyển đổi nó thành mảng byte.Để đạt được điều đó, chúng ta có thể sử dụng phương thức mã hóa () của lớp chuỗi!Nó sẽ mã hóa phiên bản chuỗi của mật khẩu bạn muốn băm vào một mảng byte, được đưa ra một loại mã hóa nhất định và làm cho có thể băm bằng bcrypt.use the encode() method of the string class! It will encode the string version of the password you want to hash into a byte array, given a certain encoding type, and make it possible to hash using BCrypt.

Làm thế nào để bạn truyền một mật khẩu được mã hóa trong Python?

Steps:..
Nhập thư viện RSA ..
Tạo khóa công khai và riêng tư với RSA.....
Mã hóa chuỗi thành chuỗi byte ..
Sau đó mã hóa chuỗi byte bằng khóa công khai ..
Sau đó chuỗi được mã hóa có thể được giải mã bằng khóa riêng ..
Khóa công khai chỉ có thể được sử dụng để mã hóa và riêng tư chỉ có thể được sử dụng để giải mã ..

Làm thế nào để bạn tạo một hàm băm trong Python?

Ví dụ 1: Làm thế nào băm () hoạt động trong Python ?..
# Hash cho số nguyên không thay đổi.in ('băm cho 181 là:', băm (181)).
# Hash cho thập phân.in ('băm cho 181,23 là:', băm (181,23)).
# băm cho chuỗi.in ('băm cho python là:', băm ('python')).