Android'de erişim belirteci ve sırrı nasıl güvenli bir şekilde saklanır?


123

Google'dan postaları ve kişileri almak için oAuth kullanacağım. Kullanıcıdan bir erişim belirteci ve sırrı almak için her oturum açmasını istemek istemiyorum. Anladığım kadarıyla, bunları uygulamamla birlikte bir veritabanında veya SharedPreferences. Ama bununla ilgili güvenlik hususları konusunda biraz endişeliyim. Belirteçleri şifreleyebileceğinizi ve deşifre edebileceğinizi okudum, ancak bir saldırganın apk'nizi ve sınıflarınızı çözmesi ve şifreleme anahtarını alması kolaydır.
Bu jetonları Android'de güvenli bir şekilde saklamanın en iyi yöntemi nedir?


1
Tüketici anahtarını ve sırrını nasıl saklayabilirim (bunların sabit bağlanması güvenli değildir)? erişim belirteci ve sır istemelerine ihtiyacım var .. oauth kullanan diğer mevcut uygulamalar bunu nasıl yapıyor? hmm nihayet oauth ile, benim için çok daha fazla güvenlik sorunuyla ilgilenmeniz gerekiyor .... tüketici jetonunu / sırrını ve ayrıca erişim jetonunu ve sırrı güvenli bir şekilde saklamam gerekiyor .... nihayet daha kolay olmaz mıydı sadece kullanıcının kullanıcı adını / şifresini şifreli olarak saklayın? ... sonunda, ikincisi daha iyi değil mi? Oauth'un nasıl daha iyi olduğunu hala göremiyorum ...
yeahman

bana söyleyebilir misin .. erişim belirtecini hangi dosya saklıyor? Android'de yeniyim ve Sample Plus uygulamasını çalıştırmayı denedim, ancak bunu hiçbir yerde bulamıyorum [GoogleAuthUtil.getToken () yöntemi.]
Abhishek Kaushik

Yanıtlar:


117

Bunları paylaşılan tercihler olarak saklayın . Bunlar varsayılan olarak özeldir ve diğer uygulamalar bunlara erişemez. Köklü cihazlarda, kullanıcı onları okumaya çalışan bir uygulamaya açıkça erişime izin verirse, uygulama bunları kullanabilir, ancak buna karşı koruma sağlayamazsınız. Şifrelemeye gelince, kullanıcının her seferinde şifre çözme parolasını girmesini istemeniz (böylece kimlik bilgilerini önbelleğe alma amacını ortadan kaldırmanız gerekir) veya anahtarı bir dosyaya kaydetmeniz gerekir ve aynı sorunu yaşarsınız.

Gerçek kullanıcı adı şifresi yerine belirteçleri saklamanın birkaç avantajı vardır:

  • Üçüncü parti uygulamaların şifreyi bilmesine gerek yoktur ve kullanıcı şifreyi yalnızca orijinal siteye (Facebook, Twitter, Gmail, vb.) Göndereceğinden emin olabilir.
  • Bir kişi bir jeton çalsa bile, şifreyi göremez (kullanıcı bunu başka sitelerde de kullanıyor olabilir)
  • Jetonların genellikle bir ömrü vardır ve belirli bir süre sonra sona erer
  • Jetonların güvenliğinin ihlal edildiğinden şüpheleniyorsanız iptal edilebilir

1
cevap için teşekkürler! ancak tüketici anahtarımın güvenliğinin ihlal edilip edilmediğini nasıl bilebilirim? lol bunu söylemek zor olacak .. tamam erişim belirtecini ve sırrını saklamakla ilgili, tamam onları paylaşılan tercihlere kaydedip şifreliyorum ama tüketici anahtarı ve sırrı ne olacak? Bunları paylaşılan tercihlerde saklayamıyorum (ilk etapta paylaşılan tercihe kaydetmek için tüketici anahtarını ve sırrını kodda açıkça yazmam gerekir) .. ne demek istediğimi anladığınızı bilmiyorum.
yeahman

2
Ya uygulamaya (biraz) karmaşık bir şekilde yerleştirmelisiniz, çünkü bunlar derlemenin çözülmesinden hemen sonra görünmezler ya da anahtar ve sırrı olan kendi yetkilendirme proxy web uygulamanızı kullanmanız gerekir. Bunları uygulamaya koymak açıkça daha kolaydır ve birinin uygulamanızı kırmaya çalışması riskinin yeterince düşük olduğunu düşünüyorsanız, bu yaklaşımı kullanın. BTW, yukarıdaki noktalar kullanıcı şifresi içindir. Tüketici anahtarınızın / sırrınızın ele geçirildiğini öğrenirseniz, bunları da iptal edebilirsiniz (bu tabii ki uygulamanızı bozacaktır).
Nikolay Elenkov

1
@NikolayElenkov: 'Şifrelemeye gelince, kullanıcının her seferinde şifre çözme parolasını girmesini istemeniz gerekir (böylece kimlik bilgilerini önbelleğe alma amacını ortadan kaldırırsınız) veya anahtarı bir dosyaya kaydetmeniz gerekir ve aynı sorunu yaşarsınız.' . Ya bilgisayar korsanları, şifrelemenin nasıl çalıştığını anlamak için uygulamanızı tersine çevirirse? Savunmanız bozulmuş olabilir. Bu tür bilgileri (belirteç, şifreleme ...) yerel kod kullanarak depolamak en iyi yöntem mi?
anhldbk

1
Uygulama verileri temizlenirse, yenileme jetonu kaybolur ve bu muhtemelen kullanıcının istediği şey değildir.
RDS

1
Artık jeton depolamanın en iyi yolu bu değil!
Rahul Rastogi

19

Bunları AccountManager'da saklayabilirsiniz . Bu adamlara göre en iyi uygulama olarak kabul edilir.

görüntü açıklamasını buraya girin

Resmi tanım şu şekildedir:

Bu sınıf, kullanıcının çevrimiçi hesaplarının merkezi bir kayıt defterine erişim sağlar. Kullanıcı, her hesap için bir kez kimlik bilgilerini (kullanıcı adı ve şifre) girerek, "tek tıklama" onayıyla uygulamalara çevrimiçi kaynaklara erişim izni verir.

AccountManager'ın nasıl kullanılacağına ilişkin ayrıntılı kılavuz için:

Ancak, sonunda AccountManager jetonunuzu yalnızca düz metin olarak saklar. Bu yüzden, AccountManager'da saklamadan önce sırrınızı şifrelemenizi öneririm. AESCrypt veya AESCrypto gibi çeşitli Şifreleme kitaplığını kullanabilirsiniz.

Diğer bir seçenek de Conceal library kullanmaktır . Facebook için yeterince güvenli ve kullanımı AccountManager'dan çok daha kolay. Conceal kullanarak gizli bir dosyayı kaydetmek için bir kod parçacığı.

byte[] cipherText = crypto.encrypt(plainText);
byte[] plainText = crypto.decrypt(cipherText);

2
Gizlemek için iyi bir ipucu. Kullanımı çok kolay görünüyor. Ve birçok kullanım durumu için.
lagos

Conceal bağlantı üzerinden bulunamadı. Devre dışı bırakılmış olabilir
user1114

10

SharedPreferences , kendi başına güvenli bir konum değildir. Köklü bir cihazda, tüm uygulamaların SharedPrefereces xml'lerini kolayca okuyabilir ve değiştirebiliriz. Bu nedenle jetonların süresi nispeten sık dolmalıdır. Ancak bir jetonun süresi her saat geçse bile, daha yeni jetonlar yine de SharedPreferences'tan çalınabilir. Android KeyStore, kriptografik anahtarların uzun süreli depolanması ve alınması için kullanılmalıdır; bu anahtarlar, örneğin Paylaşılan Tercihler veya bir veri tabanında saklamak için simgelerimizi şifrelemek için kullanılır. Anahtarlar bir uygulamanın işleminde saklanmaz, bu nedenle tehlikeye atılmaları daha zordur .

Bir yerden çok daha alakalı olmaları, örneğin kriptografik olarak imzalanmış kısa ömürlü JWT'ler kullanarak, bunları Android KeyStore kullanarak şifreleyerek ve bunları güvenli bir protokolle göndererek nasıl güvenli olabilecekleridir.


9
O halde onları nerede saklayabiliriz?
Milind Mevada

2
  1. Android Studio'nuzun Proje bölmesinden "Proje Dosyaları" nı seçin ve projenizin kök dizininde "keystore.properties" adlı yeni bir dosya oluşturun.

görüntü açıklamasını buraya girin

  1. "Keystore.properties" dosyasını açın ve Erişim Simgenizi ve Sırrınızı dosyaya kaydedin.

görüntü açıklamasını buraya girin

  1. Şimdi, uygulama modülünüzün build.gradle dosyasındaki Erişim Simgesini ve Sırrı okuyun . Ardından, Erişim Simgeniz ve Sırrınız için BuildConfig değişkenini tanımlamanız gerekir, böylece bunlara doğrudan kodunuzdan erişebilirsiniz. Kişisel build.gradle aşağıdaki gibi görünebilir:

    ... ... ... 
    
    android {
        compileSdkVersion 26
    
        // Load values from keystore.properties file
        def keystorePropertiesFile = rootProject.file("keystore.properties")
        def keystoreProperties = new Properties()
        keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    
        defaultConfig {
            applicationId "com.yourdomain.appname"
            minSdkVersion 16
            targetSdkVersion 26
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
            // Create BuildConfig variables
            buildConfigField "String", "ACCESS_TOKEN", keystoreProperties["ACCESS_TOKEN"]
            buildConfigField "String", "SECRET", keystoreProperties["SECRET"]
        }
    }
  2. Erişim Jetonunuzu ve Sırrınızı kodunuzda şu şekilde kullanabilirsiniz:

    String accessToken = BuildConfig.ACCESS_TOKEN;
    String secret = BuildConfig.SECRET;

Bu şekilde Access Token ve Secret'i projenizin içinde düz metin olarak saklamanıza gerek kalmaz. Bu nedenle, birisi APK'nızı yeniden derlese bile, siz onları harici bir dosyadan yüklerken Erişim Simgenizi ve Sırrınızı asla alamaz.


1
Görünüşe göre sabit kodlama yerine bir özellikler dosyası oluşturmanın hiçbir farkı yok.
Dzshean

Token'i çalışma zamanında yazmak istiyorum, uygulamamı her açtığımda jetonum her değiştiğinde olabilir.
Rehan Sarwar

1
API erişim belirteçleri gibi bazı belirteçleri depolamanın çok iyi bir yoludur. Kullanıcı kimlik bilgilerini saklamak istiyorsanız, NDK daha iyi bir yoldur.
Eric

7
Hassas bilgileri uygulamanızda saklamanız kesinlikle bu şekilde olmamalıdır! Depo, bu yaklaşımı kullanarak verileri içermese bile (veriler, oluşturma sürecine enjekte edilir), bu, basit bir derlemeden sonra herkesin görmesi için düz metinde belirteci / sırrı içeren bir BuildConfig dosyası oluşturur.
Hrafn

-1

İki seçeneği izleyerek erişim jetonunuzu güvence altına alabilirsiniz.

  1. Erişim jetonunuzu, tersi olmayacak şekilde android anahtar deposuna kaydedin.
  2. NDK işlevini, jetonunuzu ve NDK'nızı tersine çevirmesi çok zor olan c ++ koduyla kaydeden bazı hesaplamalarla kullanın
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.