Mã hóa mật khẩu Python

Mã hóa là quá trình dịch văn bản có thể đọc được thành các chuỗi byte vô nghĩa để chỉ người có khóa giải mã hoặc mã bí mật mới có thể đọc được. Quá trình này đóng một vai trò quan trọng trong việc bảo mật nội dung của bạn. Nó giúp mã hóa nội dung, xác minh nguồn gốc của tài liệu, chứng minh rằng nội dung không bị sửa đổi sau khi được gửi và đảm bảo rằng dữ liệu từ tài liệu được an toàn

Bài viết này giải thích cách Aspose. Words cho phép bạn mã hóa tài liệu và cách kiểm tra xem tài liệu có mã hóa hay không

Mã hóa bằng mật khẩu

Để mã hóa tài liệu, hãy sử dụng thuộc tính mật khẩu để cung cấp mật khẩu có chức năng như khóa mã hóa. Điều này sẽ sửa đổi nội dung tài liệu của bạn và làm cho nó không thể đọc được. Tài liệu được mã hóa sẽ yêu cầu nhập mật khẩu này trước khi có thể mở được

Bạn có thể tìm thuộc tính mật khẩu thích hợp cho định dạng được yêu cầu. Mỗi định dạng lưu tài liệu trong aspose. từ. mô-đun lưu có một lớp tương ứng chứa các tùy chọn lưu cho định dạng này. Ví dụ: thuộc tính mật khẩu trong lớp DocSaveOptions cho DOC hoặc thuộc tính mật khẩu trong lớp OoxmlSaveOptions cho DOCX, DOCM, DOTX, DOTM và FlatOpc

Lưu ý rằng chỉ một số định dạng tài liệu hỗ trợ mã hóa. Ví dụ: RTF không hỗ trợ mã hóa

Bảng bên dưới liệt kê các định dạng và thuật toán mã hóa được Aspose hỗ trợ. Từ ngữ

Định dạng Mã hóa được hỗ trợ trong khi tải Mã hóa được hỗ trợ trong khi lưu Mã hóa DOC, DOTXOR Mã hóa RC4 40-bitCryptoAPI Mã hóa RC4 Mã hóa RC4 (40-bit)DOCX, DOTX, DOCM, DOTM, FlatOPC, FlatOpcTemplate, FlatOpcMacroEnabled, FlatOpcTemplateMacroEnabledMã hóa tiêu chuẩn ECMA-376 Mã hóa nhanh nhẹn ECMA-376 Mã hóa tiêu chuẩn ECMA-376 (

Ví dụ mã sau đây cho biết cách mã hóa tài liệu bằng mật khẩu

import aspose.words as aw

# Create a document.
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.write("Hello world!")

# DocSaveOptions only applies to Doc and Dot save formats.
options = aw.saving.DocSaveOptions(aw.SaveFormat.DOC);

// Set a password with which the document will be encrypted, and which will be required to open it.
options.password = "MyPassword"
doc.save(artifacts_dir + "DocSaveOptions.SaveAsDoc.doc", options)

Kiểm tra xem tài liệu có được mã hóa không

Trong một số trường hợp, bạn có thể có một tài liệu không thể đọc được và muốn đảm bảo rằng tài liệu đó được mã hóa và không bị hỏng hoặc nén

Để phát hiện xem tài liệu có được mã hóa hay không và có yêu cầu mật khẩu hay không, bạn có thể sử dụng thuộc tính is_encrypted của lớp FileFormatInfo. Thuộc tính này cũng sẽ cho phép bạn thực hiện một số hành động trước khi tải tài liệu, chẳng hạn như thông báo cho người dùng cung cấp mật khẩu

Ví dụ mã sau đây cho thấy cách phát hiện mã hóa tài liệu

import aspose.words as aw

# Create a document.
doc = aw.Document()
saveOptions = aw.saving.OdtSaveOptions(aw.SaveFormat.ODT)
saveOptions.password = "MyPassword"

doc.Save(artifacts_dir + "File.DetectDocumentEncryption.odt", saveOptions)
            
# Create a FileFormatInfo object for this document.
info = aw.FileFormatUtil.detect_file_format(artifacts_dir + "File.DetectDocumentEncryption.odt")

# Verify the encryption status of our document.
self.assertTrue(info.is_encrypted)

Mở tài liệu có hoặc không có mật khẩu

Khi chúng tôi chắc chắn rằng một tài liệu được mã hóa, chúng tôi có thể thử mở tài liệu này mà không cần mật khẩu, điều này sẽ dẫn đến một ngoại lệ

Ví dụ mã sau đây cho biết cách thử mở tài liệu được mã hóa mà không cần mật khẩu

import aspose.words as aw

# Create a document.
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.write("Hello world!")

# OoxmlSaveOptions only applies to Docx, Docm, Dotx, Dotm, or FlatOpc formats.
options = aw.saving.OoxmlSaveOptions(aw.SaveFormat.DOCX)

# Set a password with which the document will be encrypted, and which will be required to open it.
options.password = "MyPassword"
doc.Save(artifacts_dir + "OoxmlSaveOptions.SaveAsDocx.docx", options)

# We will not be able to open this document with Microsoft Word or
# Aspose.Words without providing the correct password.
# The following line will throw an exception.
doc = aw.Document(artifacts_dir + "OoxmlSaveOptions.Password.docx"))

Sau khi chúng tôi thấy rằng không thể mở tài liệu được mã hóa nếu không có mật khẩu, chúng tôi có thể thử mở tài liệu đó bằng cách nhập mật khẩu

Mô-đun này triển khai giao diện cho thủ tục crypt(3), là hàm băm một chiều dựa trên thuật toán DES đã sửa đổi; . Các cách sử dụng có thể bao gồm lưu trữ mật khẩu băm để bạn có thể kiểm tra mật khẩu mà không lưu trữ mật khẩu thực hoặc cố gắng bẻ khóa mật khẩu Unix bằng từ điển

Lưu ý rằng hành vi của mô-đun này phụ thuộc vào việc triển khai thực tế quy trình crypt(3) trong hệ thống đang chạy. Do đó, bất kỳ tiện ích mở rộng nào có sẵn trong quá trình triển khai hiện tại cũng sẽ có sẵn trên mô-đun này

Unix, không phải VxWorks

không phải Emscripten, không phải WASI

Mô-đun này không hoạt động hoặc không khả dụng trên nền tảng WebAssembly wasm32-emscriptenwasm32-wasi. Xem để biết thêm thông tin

Phương pháp băm

Mới trong phiên bản 3. 3

Mô-đun xác định danh sách các phương thức băm (không phải tất cả các phương thức đều có sẵn trên tất cả các nền tảng)

mật mã. METHOD_SHA512

Phương thức Định dạng mật mã mô-đun với muối 16 ký tự và hàm băm 86 ký tự dựa trên hàm băm SHA-512. Đây là phương pháp mạnh nhất

mật mã. METHOD_SHA256

Một phương thức Định dạng mật mã mô-đun khác với muối 16 ký tự và hàm băm 43 ký tự dựa trên hàm băm SHA-256

mật mã. METHOD_BLOWFISH

Một phương thức Định dạng mật mã mô-đun khác với muối 22 ký tự và hàm băm 31 ký tự dựa trên mật mã Blowfish

Mới trong phiên bản 3. 7

mật mã. METHOD_MD5

Một phương thức Định dạng mật mã mô-đun khác với muối 8 ký tự và hàm băm 22 ký tự dựa trên hàm băm MD5

mật mã. METHOD_CRYPT

Phương pháp truyền thống với muối 2 ký tự và hàm băm 13 ký tự. Đây là phương pháp yếu nhất

Thuộc tính mô-đun

Mới trong phiên bản 3. 3

mật mã. phương pháp

Danh sách các thuật toán băm mật khẩu có sẵn, dưới dạng đối tượng crypt.METHOD_*. Danh sách này được sắp xếp từ mạnh nhất đến yếu nhất

Chức năng mô-đun

Mô-đun xác định các chức năng sau

mật mã. crypt(word , salt=None)

từ thường sẽ là mật khẩu của người dùng khi được nhập tại dấu nhắc hoặc trong giao diện đồ họa. Muối tùy chọn là một chuỗi như được trả về từ , một trong các giá trị crypt.METHOD_* (mặc dù không phải tất cả đều có sẵn trên tất cả các nền tảng) hoặc mật khẩu được mã hóa đầy đủ bao gồm cả muối, như được trả về bởi hàm này. Nếu muối không được cung cấp, phương pháp mạnh nhất hiện có sẽ được sử dụng

Việc kiểm tra mật khẩu thường được thực hiện bằng cách chuyển mật khẩu văn bản thuần dưới dạng từ và kết quả đầy đủ của cuộc gọi trước, kết quả này phải giống với kết quả của cuộc gọi này

muối (có thể là một chuỗi 2 hoặc 16 ký tự ngẫu nhiên, có thể có tiền tố là

import crypt
from hmac import compare_digest as compare_hash

hashed = crypt.crypt(plaintext)
if not compare_hash(hashed, crypt.crypt(plaintext, hashed)):
    raise ValueError("hashed version doesn't validate against original")
4 để chỉ phương thức) sẽ được sử dụng để gây nhiễu thuật toán mã hóa. Các ký tự trong muối phải thuộc bộ
import crypt
from hmac import compare_digest as compare_hash

hashed = crypt.crypt(plaintext)
if not compare_hash(hashed, crypt.crypt(plaintext, hashed)):
    raise ValueError("hashed version doesn't validate against original")
5, ngoại trừ Định dạng mật mã mô-đun có tiền tố là
import crypt
from hmac import compare_digest as compare_hash

hashed = crypt.crypt(plaintext)
if not compare_hash(hashed, crypt.crypt(plaintext, hashed)):
    raise ValueError("hashed version doesn't validate against original")
4

Trả về mật khẩu đã băm dưới dạng một chuỗi, sẽ bao gồm các ký tự từ cùng một bảng chữ cái với muối

Vì một số tiện ích mở rộng crypt(3) cho phép các giá trị khác nhau, với các kích thước khác nhau trong muối, nên sử dụng mật khẩu được mã hóa đầy đủ làm muối khi kiểm tra mật khẩu

Đã thay đổi trong phiên bản 3. 3. Chấp nhận giá trị crypt.METHOD_* ngoài chuỗi cho muối.

mật mã. mksalt(phương pháp=Không, *, rounds=None)

Trả về một loại muối được tạo ngẫu nhiên của phương pháp đã chỉ định. Nếu không có phương pháp nào được đưa ra, phương pháp mạnh nhất có sẵn trong được sử dụng

Giá trị trả về là một chuỗi phù hợp để chuyển làm đối số muối cho

round chỉ định số lượng round cho crypt0, crypt1 và crypt2. Đối với crypt0 và crypt1, nó phải là một số nguyên trong khoảng từ crypt5 đến crypt6, mặc định là crypt7. Đối với crypt2, nó phải là lũy thừa hai trong khoảng từ crypt9 (24) đến crypt0 (231), giá trị mặc định là crypt1 (212)

Mới trong phiên bản 3. 3

Đã thay đổi trong phiên bản 3. 7. Đã thêm tham số vòng.

ví dụ

Một ví dụ đơn giản minh họa cách sử dụng thông thường (cần có thao tác so sánh thời gian không đổi để hạn chế tiếp xúc với các cuộc tấn công theo thời gian. thích hợp cho mục đích này)

import pwd
import crypt
import getpass
from hmac import compare_digest as compare_hash

def login():
    username = input('Python login: ')
    cryptedpasswd = pwd.getpwnam(username)[1]
    if cryptedpasswd:
        if cryptedpasswd == 'x' or cryptedpasswd == '*':
            raise ValueError('no support for shadow passwords')
        cleartext = getpass.getpass()
        return compare_hash(crypt.crypt(cleartext, cryptedpasswd), cryptedpasswd)
    else:
        return True

Để tạo hàm băm của mật khẩu bằng phương pháp mạnh nhất hiện có và kiểm tra mật khẩu đó với bản gốc

Làm cách nào để mã hóa tệp văn bản bằng mật khẩu trong Python?

Mã hóa tệp bằng khóa được tạo .
Mở tệp chứa khóa
Khởi tạo đối tượng Fernet và lưu trữ nó trong biến fernet
Đọc tập tin gốc
Mã hóa tệp và lưu trữ tệp vào một đối tượng
Sau đó ghi dữ liệu được mã hóa vào cùng một tệp nba. csv

Thuật toán mã hóa nào tốt nhất cho mật khẩu Python?

BCrypt là 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 đầu. 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.