Android Play Integrity API Kullanarak Cihaz Doğrulaması yapmak
Selamlar, Play Integrity API’yi kullanmanın bize katkısı nedir ne işe yarar? Bu sorulara cevapları getirerek başlayalım.
Neden ihtiyacımız var?
Uygulamalardaki SSL/TLS sertifikalarının güvenliğini sağlamak için kullanılan SSL Pinning mekanizması, etkisiz hale getirmek için bazı saldırı yöntemleri var. SSL pinning, uygulamanın yalnızca önceden belirlenmiş bir SSL/TLS sertifikasıyla güvenli bir şekilde bağlantı kurmasına izin verir ve saldırganların, uygulamanın kullanıcısıyla olan iletişimini ele geçirmesini veya dinlemesini zorlaştırır. Uygulamanın iletişimini dinlemek veya manipüle etmek için kullanılabilecek şifreleme korumasını kaldırılabilir. Yani SSL Pinning atlatması, hassas bilgileri ele geçirilmesine veya kullanıcıların kimlik bilgilerinin çalınmasına neden olabilir.
Uygulamama ne katkısı var?
Play Integrity API’si ile cihaz doğrulaması yetkisiz istemcilerin yani hackerların arka uç kaynaklarınıza erişmesini engelleyerek API kaynaklarınızı kötüye kullanımdan korumaya yardımcı olur. Bir oyun uygulamanız veya kredi kartı bilgilerini aldığınız yapılar mevcutsa kesinlikle kullanmanız gerekiyor yoksa müşterilerinin cihazlarına sızan zararlı yazılımlar ile müşterilerinizin manipüle olmasını engelleyemezsiniz.
Nasıl kullanabilirim?
Öncelikle Mobile App Attestation olarak Android de iki adet yöntem var. Birisi SafetyNet ve onun yerine gelen Play Integrity Api. Safetynet yakın zamanda kullanımdan kaldırılacaktır. Bu yüzden Play Integrity API’nin nasıl çalıştığına bakalım.
- Server üzerinde kurulumlar tamamlanır. (sdk initialize and play integrity request design)
- Şu özelliklerde bir nonce (string) oluşturma;
String
- URL-safe
- Encoded as Base64 and non-wrapping
- Minimum of 16 characters
- Maximum of 500 characters
3. Android uygulamasına gönderilen nonce ile android sdk’sında yapılacak kurulumlar.
4. Andorid uygulaması üzerinden Integrity SDK’sına nonce gönderimi ile alınan tokenin servise gönderilmesi
5. Sunucunun play integrity requestine androidden gelen token’i göndermesi.
6. Sunucu dönen response ile ilgili android uygulamasına bildirim yapması
7. Android uygulamasına güvenli girişin kullanılarak bazı etkilerin veya uygulamaya komple girişin yasaklanması.
Play Console üzerinde düzenlemeler
Play Console’da Setup -> App integrity alanına girin. Integrity API tab’ında Google Cloud project satırını göreceksiniz. Bir projeniz yoksa oluşturun. Bir projeniz varsa dahi edit diyip istediğiniz projeyi linkleyin.
Projeyi linklemezseniz benim gibi uzun uğraşlar verip sorunun bundan kaynaklandığını görebilirisiniz.
- Daha sonra View project diyip Google Cloud’a gidin.
- Yukarıdaki arama butonuna Play Integrity API yazın.
- Yukarıda resimdeki gibi bir view görmeniz gerekiyor.
- Manage’a tıklayın. Açılan sayfadan Credentials tab’ına tıklayın.
- Açılan alanda sağ taraftaki Create Credentials -> Service Account diyin.
- Açılan sayfada “Service Account Name” alanını doldurun doldurmaya başlayınca alt taraftaki alana otomatik id oluşturulacaktır.
- Başka hiç bir şeye dokunmadan create continue diyin.
- Ve az önceki sayfaya geri dönün.
- yukarıdaki service account a tıklayın ve açılan sayfada Keys tabına gidin
- Add Key -> Create New Key -> Json diyip ilgili client secret json dosyasını indirin.
Server kurulumu
Maven Dependency;
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-playintegrity</artifactId>
<version>v1-rev20230514-2.0.0</version>
</dependency>
Java;
node js için buradan bakabilirsiniz;
Android (kotlin) Kurulumu
Sdk Kurulumu;
Gradle/Grovy Bağımlılığı Eklenmesi
implementation "com.google.android.play:integrity:1.1.0"
Nonce oluşturulması
private fun generateNonce(): String {
val length = 50
var nonce = ""
val allowed = Utilities.SPECIAL_CHARACTER_PROHIBITED
try {
for (i in 0 until length) {
nonce += allowed[floor(Math.random() * allowed.length).toInt()].toString()
}
} catch (e: Exception) {
Log.e("something went wrong try again later" + "\n\nDescription: " + e.message)
}
return nonce
}
Play Integrity SDK kurulumu
val integrityManager = IntegrityManagerFactory.create(context)
val integrityTokenResponseTask = integrityManager.requestIntegrityToken(
IntegrityTokenRequest.builder()
.setNonce(generateNonce())
.setCloudProjectNumber(CLOUD_PROJECT_NUMBER)
.build()
)
integrityTokenResponseTask.addOnSuccessListener { integrityTokenResponse: IntegrityTokenResponse ->
val integrityToken = integrityTokenResponse.token()
Log.d("integrityToken $integrityToken")
}
integrityTokenResponseTask.addOnFailureListener { e: Exception ->
Log.e("something went wrong try again later" + "\n\nDescription: " + e.message)
}
Cloud Project Number; Yukarıda View project diyip Google Cloud’a gittiğinizde anasayfada gözüken numarayı buraya yazacaksınız.
Sonra ilgili integrityToken servise gönderilip doğrulamalar yapıldığında servisten gelen bilgiler doğrultusunda uygulamaya girişin yapılıp yapılamayacağına karar verilmelidir.
Umarım ayrıntılardan sıkılmayıp buraya kadar her şeyi doğru yapabilmişsinizdir. Sorun yaşadığınızda buradan yorum olarak yazabilirsiniz.
Teşekkürler.
Görkem KARA