2016-08-18 18 views
28

Tôi đang tạo ứng dụng React Native và tôi cần lưu một số dữ liệu nhạy cảm như mã thông báo và mã thông báo làm mới. Giải pháp hiển nhiên là lưu thông tin đó bằng cách sử dụng AsyncStorage. Vấn đề là mức độ bảo mật của AsyncStorage.Lưu dữ liệu nhạy cảm trong React Native

AsyncStorage cung cấp cách lưu trữ mã thông báo và mã thông báo cục bộ. Nó có thể , theo một số cách, so với tùy chọn LocalStorage. Trong các ứng dụng sản xuất đầy đủ , bạn không nên truy cập trực tiếp AsyncStorage , nhưng thay vào đó, sử dụng lớp trừu tượng, AsyncStorage là được chia sẻ với các ứng dụng khác sử dụng cùng một trình duyệt và do đó xóa bị loại bỏ tất cả các mục khỏi bộ nhớ có thể làm giảm hoạt động của các ứng dụng lân cận.

https://auth0.com/blog/adding-authentication-to-react-native-using-jwt/

Trong một ứng dụng bản địa, tôi sẽ đi cho Keychain trong iOSShared Preferences trong chế độ riêng trong Android.

Đối với những gì tôi đọc trong các tài liệu được cung cấp bởi Phản ứng Quê quán:

Trên iOS, AsyncStorage được hỗ trợ bởi mã nguồn gốc lưu trữ các giá trị nhỏ trong một cuốn từ điển serialized và lớn hơn các giá trị trong các tập tin riêng biệt. Trên Android, AsyncStorage sẽ sử dụng RocksDB hoặc SQLite dựa trên những gì khả dụng.

https://facebook.github.io/react-native/docs/asyncstorage.html

Họ không bao giờ nói về sự an toàn của dữ liệu đó.

Đây là giải pháp tốt nhất tạo ra một mô-đun cho Android (có sử dụng Shared Preferences trong chế độ riêng) và một cho iOS (có sử dụng Keychain) để lưu các dữ liệu nhạy cảm? Hoặc sử dụng các phương pháp AsyncStorage có an toàn không?

+0

Những gì bạn đang tìm kiếm, được trả lời trong bài đăng này: http://stackoverflow.com/questions/37563224/why-the-react-native-docs-recommends-that-you-use-an-abstraction-on -top-of-async –

+0

Câu trả lời đó không đưa ra bất kỳ giả thiết nào về bảo mật của 'AsyncStorage'. –

+0

Bạn có thể xem bài đăng này: https://stackoverflow.com/questions/45547657/what-is-the-best-way-to-store-private-data-in-react-native –

Trả lời

43

Chỉ cần đào sâu vào mã Phản ứng gốc, tôi đã tìm thấy câu trả lời.

Android

Việc thực hiện React NativeAsyncStorage Module này được dựa trên SQLiteOpenHelper. Gói nơi mà tất cả các lớp dữ liệu được xử lý: https://github.com/facebook/react-native/tree/master/ReactAndroid/src/main/java/com/facebook/react/modules/storage

Các lớp học với các hướng dẫn để tạo ra các cơ sở dữ liệu: https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/com/facebook/react/modules/storage/ReactDatabaseSupplier.java

By tài liệu Android, cơ sở dữ liệu được tạo ra bởi các ứng dụng được lưu trong không gian đĩa riêng đó là liên quan ứng dụng, vì vậy nó an toàn.

Cũng giống như các file mà bạn lưu trên bộ nhớ trong của thiết bị, cửa hàng Android cơ sở dữ liệu của bạn trong không gian đĩa riêng tư đã liên ứng dụng.Dữ liệu của bạn được bảo mật, vì theo mặc định, khu vực này không phải là có thể truy cập được vào các ứng dụng khác.

Source

iOS

Trong iOS các giá trị AsyncStorage được lưu trong các tập tin từ điển serialized. Các tệp đó được lưu trong ứng dụng NSDocumentDirectory. Trong iOS, tất cả các ứng dụng đều nằm trong số hộp cát riêng của chúng, vì vậy tất cả các tệp của một ứng dụng được bảo mật, chúng không thể được truy cập bởi các ứng dụng khác.

Các mã trong iOS để xử lý các module AsyncStorage có thể được tìm thấy ở đây: https://github.com/facebook/react-native/blob/master/React/Modules/RCTAsyncLocalStorage.m

Và như chúng ta có thể thấy here các tập tin dùng để lưu trữ các giá trị lưu bởi AsyncStorage được lưu dưới NSDocumentDirectory (bên trong sandbox ứng dụng môi trường).

Mỗi ứng dụng là một đảo Tương tác của ứng dụng iOS với hệ thống tệp bị giới hạn chủ yếu vào các thư mục bên trong hộp cát của ứng dụng. Trong khi cài đặt ứng dụng mới, trình cài đặt sẽ tạo một số vùng chứa cho ứng dụng. Mỗi thùng chứa có một vai trò cụ thể. Gói vùng chứa chứa gói ứng dụng, trong khi vùng chứa dữ liệu giữ dữ liệu cho cả ứng dụng và người dùng. Vùng chứa dữ liệu được thêm được chia thành một số thư mục mà ứng dụng có thể sử dụng để sắp xếp và sắp xếp dữ liệu của nó. Ứng dụng cũng có thể yêu cầu quyền truy cập vào các vùng chứa bổ sung — ví dụ: vùng chứa iCloud — khi chạy.

Source

Kết luận

Nó là an toàn để sử dụng AsyncStorage để lưu thẻ người dùng, vì họ sẽ được lưu dưới một bối cảnh an toàn.

Xin lưu ý rằng điều này chỉ đúng cho các thiết bị Android mà không cần gốc và cho các thiết bị iOS mà không Jailbreak. Cũng xin lưu ý rằng nếu kẻ tấn công có truy cập vật lý vào thiết bị và thiết bị không được bảo vệ. Anh ta có thể kết nối thiết bị với máy tính xách tay mac và thư mục extract the documents và xem tất cả nội dung được lưu trong thư mục tài liệu.

+1

Câu trả lời hay được hỗ trợ tài liệu tham khảo và sự kiện. Cảm ơn bạn! –

+1

Re: Android: "vì vậy nó là an toàn": không có gì là an toàn, một sự gần gũi với lý tưởng của 'an toàn' có thể đạt được. Trong trường hợp này, dữ liệu có thể được truy cập nếu thiết bị được root (cho dù cố ý hay không). – straya

+4

Như tôi đã nói trong kết luận. –

2

AsyncStorage lưu cặp khóa-giá trị dưới dạng tệp JSON thô trong thư mục Tài liệu. Nó không mã hóa nội dung của nó.

Đây là vấn đề bảo mật (ít nhất là trên iOS) vì có thể kẻ tấn công có quyền truy cập vào thiết bị để lấy nội dung của hộp cát và trích xuất bất kỳ dữ liệu nào được lưu qua AsyncStorage.

Điều này được sử dụng để không được nêu rõ trong tài liệu cho AsyncStorage.js, nhưng nó bây giờ là: https://github.com/facebook/react-native/pull/8809

Xem thêm: https://stackoverflow.com/a/38398114/1072846

1

Tôi thực sự recommand bạn sử dụng một thư viện như react-native-keychain để lưu trữ dữ liệu cá nhân trong react-native

Đối với mức API Android:

  • 16-22 sử dụng Facebook Giấu
  • 23+ sử dụng Android Keystore

Bạn có thể sử dụng nó như sau:

// Generic Password, service argument optional 
Keychain 
    .setGenericPassword(username, password) 
    .then(function() { 
    console.log('Credentials saved successfully!'); 
    }); 

// service argument optional 
Keychain 
    .getGenericPassword() 
    .then(function(credentials) { 
    console.log('Credentials successfully loaded for user ' + credentials.username); 
    }).catch(function(error) { 
    console.log('Keychain couldn\'t be accessed! Maybe no value set?', error); 
    }); 
Các vấn đề liên quan