2009-04-08 40 views
35

Làm cách nào để lưu trữ mật khẩu do người dùng nhập vào bộ nhớ và xóa mật khẩu an toàn sau khi không cần nữa?Xóa mật khẩu an toàn trong bộ nhớ (Python)

Xây dựng, hiện tại chúng tôi có đoạn mã sau:

username = raw_input('User name: ') 
password = getpass.getpass() 
mail = imaplib.IMAP4(MAIL_HOST) 
mail.login(username, password) 

Sau khi gọi phương thức login, những gì làm chúng ta cần phải làm gì để lấp đầy diện tích bộ nhớ có chứa mật khẩu với các nhân vật bị cắt xén để ai đó không thể phục hồi mật khẩu bằng cách thực hiện một bãi chứa lõi?

Có một câu hỏi tương tự, tuy nhiên nó là ở Java và các giải pháp sử dụng các mảng nhân vật: How does one store password hashes securely in memory, when creating accounts?

này có thể được thực hiện bằng Python?

+0

Gần cuối [bài viết này của IBM] (http://www.ibm.com/developerworks/library/s-data.html?ns-311), họ nói về việc sử dụng cấu trúc dữ liệu có thể thay đổi thay vì không thay đổi chuỗi. –

+0

Liên kết tới bài viết của IBM trong nhận xét ở trên không hoạt động nữa, sử dụng [trang được lưu trữ] (https://web.archive.org/web/20150308000622/http://www.ibm.com/developerworks/ library/s-data.html). –

Trả lời

37

Python không có mức kiểm soát thấp trên bộ nhớ. Chấp nhận nó và di chuyển lên trên. Các tốt nhất bạn có thể làm là del password sau khi gọi mail.login để không có tham chiếu đến đối tượng chuỗi mật khẩu vẫn còn. Bất kỳ giải pháp nào nhằm mục đích để có thể làm nhiều hơn điều đó chỉ cho bạn cảm giác an toàn giả.

Đối tượng chuỗi Python không thay đổi được; không có cách nào trực tiếp để thay đổi nội dung của chuỗi sau khi được tạo. Thậm chí nếu bạn có thể ghi đè lên nội dung của chuỗi được gọi bằng password (có thể là thủ thuật ngu ngốc), vẫn sẽ có các bản sao mật khẩu khác đã được tạo trong các hoạt động chuỗi khác nhau:

  • bởi module getpass khi dải các ký tự dòng mới ra của mật khẩu đầu vào
  • bởi module imaplib khi trích dẫn lại mật khẩu và sau đó tạo ra các lệnh IMAP hoàn chỉnh trước khi đi qua nó đi đến ổ cắm

Bạn bằng cách nào đó phải có được tài liệu tham khảo cho tất cả những dây và ghi đè lên bộ nhớ của họ là tốt.

+9

Chưa kể khả năng hệ điều hành sẽ hoán đổi toàn bộ trang bộ nhớ của bạn ra đĩa, nơi có thể ngồi trong nhiều tháng. – JasonSmith

+0

Vấn đề trao đổi không phải là python cụ thể ofc, nhưng đây là một cuộc thảo luận về phần đó: https://security.stackexchange.com/questions/29350/swap-file-may-contain-sensitive-data – Zitrax

-2

EDIT: loại bỏ các lời khuyên xấu ...

Bạn cũng có thể sử dụng các mảng như ví dụ java nếu bạn thích, nhưng chỉ cần ghi đè lên nó nên là đủ.

http://docs.python.org/library/array.html

+1

Tất cả mật khẩu = "somethingelse" thực hiện là xóa tham chiếu đến mật khẩu cũ một dòng trước đó. Nó không thực sự ghi đè lên bất cứ điều gì. – Miles

+0

Tôi hiểu. Cảm ơn bạn về thông tin. –

-2

Store mật khẩu trong một danh sách, và nếu bạn chỉ cần thiết lập danh sách để null, bộ nhớ của mảng lưu trữ trong danh sách được tự động giải phóng.

+7

Mức độ vô hướng lưu trữ chuỗi trong danh sách cung cấp bảo vệ bằng không. – Miles

+2

Ngoài ra, không có đặc điểm kỹ thuật để xóa bộ nhớ sau khi được giải phóng. Bộ nhớ sẽ vẫn còn nguyên vẹn và sẽ dễ bị ảnh hưởng hoặc bị hoán đổi vào đĩa theo thời gian. – drifter

+0

Có một bài viết hay về lý do tại sao tính năng này không hoạt động chính xác: http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm – mkind

7

Nếu bạn không cần đối tượng thư tồn tại sau khi bạn đã hoàn thành nó, tôi nghĩ đặt cược tốt nhất của bạn là thực hiện công việc gửi thư trong một tiến trình con (xem mô-đun subprocess). , hãy nhập mật khẩu của bạn.

17

Thực sự có một cách để xóa chuỗi an toàn bằng Python; sử dụng memset C chức năng, theo Mark data as sensitive in python

+1

Lưu ý rằng đây là HĐH -phụ thuộc. Mã Windows và Linux được đưa ra trong bài đăng được liên kết. – Luc

2

Điều này có thể được thực hiện bằng chararray NumPy:

import numpy as np 

username = raw_input('User name: ') 
mail = imaplib.IMAP4(MAIL_HOST) 
x = np.chararray((20,)) 
x[:] = list("{:<20}".format(raw_input('Password: '))) 
mail.login(username, x.tobytes().strip()) 
x[:] = '' 

Bạn sẽ phải xác định kích thước tối đa của mật khẩu, nhưng điều này sẽ loại bỏ các dữ liệu khi nó được ghi đè.

Các vấn đề liên quan