Tôi cần lưu trữ mật khẩu của người dùng trong một khoảng thời gian ngắn trong bộ nhớ. Làm thế nào tôi có thể làm như vậy nhưng không có thông tin như vậy vô tình tiết lộ trong coredumps hoặc tracebacks? Có cách nào để đánh dấu một giá trị là "nhạy cảm", do đó, nó không được lưu ở bất cứ nơi nào bởi một trình gỡ lỗi?Đánh dấu dữ liệu là nhạy cảm trong python
Trả lời
Sửa
Tôi đã thực hiện một giải pháp mà sử dụng ctypes (mà lần lượt sử dụng C) vào bộ nhớ không.
import sys
import ctypes
def zerome(string):
location = id(string) + 20
size = sys.getsizeof(string) - 20
memset = ctypes.cdll.msvcrt.memset
# For Linux, use the following. Change the 6 to whatever it is on your computer.
# memset = ctypes.CDLL("libc.so.6").memset
print "Clearing 0x%08x size %i bytes" % (location, size)
memset(location, 0, size)
Tôi không đảm bảo về sự an toàn của mã này. Nó được thử nghiệm để làm việc trên x86 và CPython 2.6.2. Thời gian ghi dài hơn là here.
Giải mã và mã hóa bằng Python sẽ không hoạt động. Chuỗi và số nguyên được tập trung và liên tục, có nghĩa là bạn đang để lại một mớ thông tin mật khẩu khắp nơi.
Hashing là câu trả lời tiêu chuẩn, mặc dù tất nhiên bản rõ ràng cuối cùng cần được xử lý ở đâu đó.
Giải pháp đúng là thực hiện các quy trình nhạy cảm dưới dạng mô-đun C.
Nhưng nếu bộ nhớ của bạn liên tục bị xâm phạm, tôi sẽ suy nghĩ lại về thiết lập bảo mật của bạn.
Điều này đúng. Nếu bạn/bao giờ/đọc mật khẩu vào một đối tượng Python, có khả năng nó bị xâm nhập bởi một bãi chứa. Ngay cả khi sử dụng C không hoàn hảo (bạn vẫn có thể đóng băng chương trình và sử dụng trình gỡ rối cấp hạt nhân), nhưng nó phải đủ tốt. –
Ghi danh đã chết. :( – Barry
Nếu đây là cùng một 'memset' như được đề cập trong bài viết sau, điều này cũng không an toàn. Http://www.viva64.com/en/b/0178/ hoặc https://www.owasp.org /index.php/Insecure_Compiler_Optimization – Danny
Không có cách nào để "đánh dấu nhạy cảm", nhưng bạn có thể mã hóa dữ liệu trong bộ nhớ và giải mã lại khi bạn cần sử dụng
- XOR với một pad một lần được lưu trữ riêng
- luôn lưu trữ băm ướp muối chứ không phải là mật khẩu riêng của mình
hoặc, nếu bạn đang rất hoang tưởng về bãi, lưu trữ khóa ngẫu nhiên độc đáo trong một số khác nơi, ví dụ i một chủ đề khác nhau, trong một registry, trên máy chủ của bạn, vv
... Giải pháp duy nhất cho điều này là sử dụng cấu trúc dữ liệu có thể thay đổi. Đó là , bạn chỉ được sử dụng cấu trúc dữ liệu cho phép bạn tự động thay thế các phần tử. Ví dụ, trong Python bạn có thể sử dụng danh sách để lưu trữ một mảng ký tự . Tuy nhiên, mỗi lần bạn thêm hoặc xóa một phần tử khỏi danh sách, ngôn ngữ có thể sao chép toàn bộ danh sách sau lưng của bạn, tùy thuộc vào chi tiết triển khai. Để an toàn, nếu bạn phải tự động thay đổi kích thước cấu trúc dữ liệu, bạn nên tạo một cấu hình dữ liệu mới, sao chép dữ liệu, sau đó ghi lại dữ liệu cũ. Ví dụ:
def paranoid_add_character_to_list(ch, l):
"""Copy l, adding a new character, ch. Erase l. Return the result."""
new_list = []
for i in range(len(l)):
new_list.append(0)
new_list.append(ch)
for i in range(len(l)):
new_list[i] = l[i]
l[i] = 0
return new_list
Nguồn: http://www.ibm.com/developerworks/library/s-data.html
- Tác giả: John Viega ([email protected]) là đồng tác giả của Xây dựng An toàn phần mềm (Addison-Wesley, 2001) và Kiến trúc doanh nghiệp Java (O'Reilly và cộng sự, 2001).John đã là tác giả của hơn 50 ấn phẩm kỹ thuật, chủ yếu trong lĩnh vực bảo mật phần mềm. Ông cũng viết Mailman, Trình quản lý danh sách gửi thư GNU và ITS4, một công cụ để tìm lỗ hổng bảo mật trong mã C và C++.
Là một biến thể: sử dụng kỹ thuật này để điền [bytearray] (https : //docs.python.org/3.1/library/functions.html#bytearray) dẫn đến một đối tượng có thể được sử dụng thay cho một thể hiện 'byte' trong rất nhiều mã python ... và có thể xóa tương đương sau đó. –
- 1. Trường hợp không nhạy cảm 'trong' - Python
- 2. Android - Lưu trữ dữ liệu nhạy cảm trong cơ sở dữ liệu sqlite
- 3. Cách chính xác để xóa dữ liệu nhạy cảm khỏi bộ nhớ trong iOS là gì?
- 4. Trường hợp MySQL không nhạy cảm nhưng Accent nhạy cảm UTF8 Khóa duy nhất
- 5. Python regex chia trường hợp không nhạy cảm trong 2,6
- 6. Case-nhạy cảm find_or_create_by_whatever
- 7. Phân loại không nhạy cảm trong MySQL
- 8. Trong DOM là trường hợp id nút nhạy cảm?
- 9. Dữ liệu nhạy cảm an toàn (thẻ tín dụng) trên RoR
- 10. Nơi lưu trữ dữ liệu nhạy cảm trong vb.net an toàn
- 11. Case-nhạy cảm PowerShell thay
- 12. Lưu trữ thông tin nhạy cảm bên trong cơ sở dữ liệu lưu giữ từ C#
- 13. trường hợp nhạy cảm và không nhạy cảm như trong SQLite
- 14. trong C#, cách thích hợp để xử lý dữ liệu nhạy cảm như mật khẩu là gì?
- 15. css trường hợp nhạy cảm
- 16. Từ đánh dấu bởi các dữ liệu đánh dấu để nến
- 17. Trường hợp RLIKE nhạy cảm
- 18. Trường hợp collation nhạy cảm trong MySQL
- 19. Deserializing Chrome Đánh dấu dữ liệu JSON trong C#
- 20. Trường hợp nhạy cảm và các dự án cơ sở dữ liệu
- 21. ở đâu để đưa thông tin nhạy cảm cơ sở dữ liệu
- 22. Tại sao bạn muốn một cơ sở dữ liệu nhạy cảm?
- 23. Mã hóa thông tin nhạy cảm trong cấu hình JBoss
- 24. Mercurial: Xóa vĩnh viễn dữ liệu nhạy cảm khỏi HG repo?
- 25. Chiến lược mã hóa để bảo mật dữ liệu nhạy cảm
- 26. xóa dữ liệu nhạy cảm nhưng không phải tệp từ lịch sử git
- 27. Trường hợp nhạy cảm WHERE trong Access 2010
- 28. So sánh chuỗi không nhạy cảm?
- 29. Tìm kiếm nhạy cảm và không nhạy cảm với trường hợp Lucene
- 30. Trường hợp F # có nhạy cảm không?
Xem thêm câu hỏi này: http://stackoverflow.com/questions/728164/securely-erasing-password-in-memory-python – Miles