2012-04-02 25 views
10

Tôi muốn xóa dữ liệu nhạy cảm khỏi bộ nhớ trong ứng dụng iOS của mình. Trong Windows tôi đã sử dụng để sử dụng SecureZeroMemory. Bây giờ, trong iOS, tôi sử dụng đồng bằng memset cũ, nhưng tôi là một chút lo lắng trình biên dịch có thể tối ưu hóa nó: snippet https://buildsecurityin.us-cert.gov/bsi/articles/knowledge/coding/771-BSI.htmlCách chính xác để xóa dữ liệu nhạy cảm khỏi bộ nhớ trong iOS là gì?

mã:

NSData *someSensitiveData; 
memset((void *)someSensitiveData.bytes, 0, someSensitiveData.length); 

Trả lời

3

diễn giải 771-BSI (link xem OP):

Một cách để tránh việc các cuộc gọi memset tối ưu hóa ra bởi trình biên dịch là để truy cập vào bộ đệm một lần nữa sau khi cuộc gọi memset trong một cách mà sẽ buộc các trình biên dịch không để tối ưu hóa vị trí. Điều này có thể đạt được bằng cách

*(volatile char*)buffer = *(volatile char*)buffer; 

sau memset() gọi.

Trong thực tế, bạn có thể viết một hàm secure_memset()

void* secure_memset(void *v, int c, size_t n) { 
    volatile char *p = v; 
    while (n--) *p++ = c; 
    return v; 
} 

(Mã lấy từ 771-BSI. Nhờ Daniel Trebbien để chỉ ra cho một khiếm khuyết có thể có của đề nghị mã trước đó.)

Tại sao volatile ngăn tối ưu hóa? Xem https://stackoverflow.com/a/3604588/220060

CẬP NHẬT Hãy cũng đọc Sensitive Data In Memory bởi vì nếu bạn có một kẻ thù trên hệ thống iOS của bạn, bạn đã ít nhiều hơi say ngay cả trước khi ông cố gắng để đọc bộ nhớ đó. Trong một bản tóm tắt, SecureZeroMemory() hoặc secure_memset() không thực sự hữu ích.

+0

Tôi nghĩ có thể có tương đương với SecureZeroMemory() trong iOS. Giải pháp của bạn có vẻ tốt, nhưng "Giải pháp sẽ có hiệu quả trên hầu hết các nền tảng, nhưng hãy tham khảo tài liệu nền tảng để xác minh rằng nó đủ để tham chiếu một nhân vật theo cách này". – HyBRiD

+0

Tôi nghĩ rằng điều này chỉ là thận trọng waddling đến và fro. Nó được quyết định bởi tiêu chuẩn truy cập vào các biến dễ bay hơi KHÔNG được tối ưu hóa. Trong thực tế nó có thể là một trong những nhân vật là một cổng phần cứng và truy cập đọc kích hoạt một cái gì đó về mức độ phần cứng. Với volatile bạn khai báo với trình biên dịch mà bạn biết tốt hơn nó và nó thậm chí không bao giờ nghĩ về việc cố gắng tối ưu hóa truy cập đó đi. Và bởi vì truy cập đó phụ thuộc vào memset() ở phía trước nó, memset() sẽ không được tối ưu hóa. – nalply

+0

Chức năng 'secure_memset' của bạn có thể không đủ. Theo http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1381.pdf, có tối ưu hóa các trình biên dịch sẽ chỉ bằng không byte đầu tiên. –

0

Vấn đề là NSData là không thay đổi và bạn không kiểm soát những gì xảy ra. Nếu bộ đệm được điều khiển bởi bạn, bạn có thể sử dụng dataWithBytesNoCopy: length: và NSData sẽ hoạt động như một trình bao bọc. Khi hoàn thành, bạn có thể ghi nhớ bộ đệm của mình.

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