2017-04-26 17 views
10

Tôi có mã thông báo truy cập từ máy chủ sau khi xác thực cho phép nói "uyhjjfjfgg567f8fhjkkf" bây giờ tôi muốn lưu mã thông báo đó vào thiết bị một cách an toàn. Tôi đã xem Keystore và Keychain trong các trang web dành cho nhà phát triển Android. Tôi không hiểu rõ cách thức hoạt động và cách chúng tôi truy xuất mã thông báo từ kho khóa.Cách lưu mã thông báo truy cập Oauth an toàn trong android

KeyPairGenerator kpg = KeyPairGenerator.getInstance(
     KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore"); 
kpg.initialize(new KeyGenParameterSpec.Builder(
     alias, 
     KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY) 
     .setDigests(KeyProperties.DIGEST_SHA256, 
      KeyProperties.DIGEST_SHA512) 
     .build()); 

KeyPair kp = kpg.generateKeyPair(); 


/* 
* Load the Android KeyStore instance using the the 
* "AndroidKeyStore" provider to list out what entries are 
* currently stored. 
*/ 

KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); 
ks.load(null); 
Enumeration<String> aliases = ks.aliases(); 

Trả lời

9

Bạn không cần phải lưu mã thông báo truy cập vì nó có thời gian tồn tại ngắn. Giữ nó trong bộ nhớ là đủ tốt.

Bạn cần phải giữ thẻ làm mới, và bạn có một vài lựa chọn cho điều đó:

  • Trong một tập tin
    • Hoặc trực tiếp trong một tập tin trong bộ nhớ trong
    • hoặc sử dụng SharedPreferences
    • hoặc trong Cơ sở dữ liệu
  • Sử dụng t anh ta AccountManager

Cân nhắc sử dụng StoredCredential. Đối với chính dòng chảy, tôi khuyên bạn nên sử dụng Google AppAuth library.

Tất nhiên, bạn cũng có thể mã hóa khóa bằng mật mã:

private static byte[] encrypt(byte[] key, byte[] text) throws GeneralSecurityException { 
    final SecretKeySpec skeySpec = new SecretKeySpec(key, KEY_ALGORITHM); 
    final Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); 
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, sInitVectorSpec); 
    return cipher.doFinal(text); 
} 

Và quan trọng có thể được lưu trữ trong KeyStore.

2

Here bạn có thể tìm thấy một bài viết thực sự hay của Androidauthority về các khả năng có sẵn cho Android Security.

Ví dụ toàn diện về triển khai kho khóa Android có thể được tìm thấy here.

Và một tùy chọn tốt khác là Google's keyczar mà bạn có thể theo dõi trên kho lưu trữ git để lấy mẫu và chi tiết. Ở đó bạn cũng có thể tìm thấy danh sách chi tiết của Known Security Issues, vì vậy bạn có thể xem danh sách này có phù hợp với việc triển khai thêm của bạn hay không.

Đối với vấn đề hiện tại của bạn, tôi khuyên bạn nên sử dụng Android Keystore sau khi triển khai ví dụ trong liên kết thứ hai ở trên.

Chúc may mắn!

0

Chúng tôi sử dụng phiên bản SharedPreference tùy chỉnh mã hóa các khóa và giá trị khi thêm và giải mã khi yêu cầu.

SecurePreferences preferences = ... 
preferences.edit().putString("key", "value").apply(); // key and value are encrypted automatically 

String value = preferences.getString("key", null); // key and value are decrypted automatically 

tôi sẽ chỉ khuyến khích dùng SharedPreferences nếu các giá trị được mã hóa, bởi vì mặc dù các tập tin xml là chỉ dành cho những ứng dụng, nó có thể được truy cập trên thiết bị gốc.

Nếu bạn đã sử dụng SqlLiteDB, có lẽ tôi sẽ sử dụng nó. Nếu không, nó hơi nặng để chỉ lưu một mã thông báo.

EDIT:

Mã thông báo oauth hoàn toàn không liên quan đến khóa và kho khóa được sử dụng để ký ứng dụng.

Mã thông báo oauth là mã thông báo do máy chủ cung cấp sau khi xác thực thông tin đăng nhập của người dùng, trong ứng dụng.

Kho lưu trữ khóa chứa 1 hoặc nhiều chứng chỉ được sử dụng để ký điện tử ứng dụng. Điều này nhằm ngăn người khác tải lên ứng dụng có cùng tên gói với tên của bạn và thay thế nó.

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