2009-06-11 27 views
19

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

+0

Xem thêm câu hỏi này: http://stackoverflow.com/questions/728164/securely-erasing-password-in-memory-python – Miles

Trả lời

30

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.

+2

Đ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. –

+0

Ghi danh đã chết. :( – Barry

+0

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

2

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

2
  • 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

4

... 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++.
+0

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 đó. –

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