Kaynak kodunda API anahtarını gizlemenin en iyi yolu


12

Bir uygulamada, özellikle ac # .NET uygulamasında özel bir API anahtarını koruma konusunda bazı fikirlere ihtiyacım var.

Öncelikle, kaynak koddaki herhangi bir şeyi gizlemenin teorik olarak imkansız olduğunu anlıyorum, bu yüzden başka bir fikir buldum, ancak bunun ne kadar makul olduğundan emin değilim. Her neyse, özel anahtarı doğrulamak için bir şekilde bir web sunucusuyla iletişim kurmak ve bunun meşru bir el sıkışma olduğunu onaylamak için uygulama ile tekrar konuşmak mümkün müdür?

Çalışmak için iki anahtarım var: bir ortak anahtar (adından da anlaşılacağı gibi, özel ile aynı özenle muamele görmesi gerekmez) ve başkalarından güvende tutulması gereken özel bir anahtar.

Bunu nasıl yapabileceğime dair herhangi bir fikir çok takdir edilecektir.


4
Konuşlandırılmış bir ikili uygulamaya erişimi olan bir kişinin anahtarı okumasını engellemeye mi çalışıyorsunuz (başlığınızın da gösterdiği gibi) veya değiştirmesini (sunucu üzerinden doğrulama fikrinizin belirttiği gibi) korumaya mı çalışıyorsunuz? Nihai hedef nedir?
gregmac

3
Bilmediği okuyucular için bir API anahtarı kavramının ana hatlarını çizmek faydalı olabilir . API anahtarı, bir hizmetle (genellikle bir web hizmeti) etkileşimde bulunan bazı yazılımların geliştiricisine verilen bir sırdır. Trafik kaynağını tanımlamak, anonim erişimlere karşı kısıtlamaları kaldırmak ve anahtarın sahibini hizmet kullanımı için faturalandırmak için kullanılır. Orta derecede gizli tutmanız ve tercihen tehlikeye girmesi durumunda iptal etmeniz bekleniyor. Servise tam olarak iletilmesi gerektiğinden, her zaman kaybedersiniz.
Lars Viklund

@gregmac Evet, uygulamanın üçüncü taraf kullanıcılarının anahtarı okumasını engellemeye çalışıyorum.
Spencer

Oraya koymayın
CodeART

Yanıtlar:


14

Özetlemek:

  • API'sını kullanabilmeniz için bir satıcı tarafından size verilen bir API anahtarınız var ve bu anahtarın başkaları tarafından bilinmesini engelleme yükümlülüğünüz var
  • Uygulama kodunuzda söz konusu satıcının API'sını (API anahtarını gerektiren) çağırıyorsunuz
  • Uygulamayı müşterilerin ikili dosyalara erişebildiği ve dolayısıyla kodu koda dönüştürme / deobfuscasyon yapabileceği veya trafiği kesebileceği sistemlere dağıtıyorsunuz

Bu anahtarın güvenliğinin aşılmasını önlemenin en iyi yolu, anahtarın kontrolünü elinizde tutmaktır. Bu, hiçbir zaman sizin dışında herhangi birinin ikiliyi okuyabileceği ve asla kontrol etmediğiniz bir iletişim bağlantısının üzerinden geçemeyeceği bir sunucuya dağıtılmaması gerektiği anlamına gelir.

Sonuçta, ikili dosyalar sizin kontrolünüz dışındaysa, içindeki her şey sizin kontrolünüz dışındadır. Benzer şekilde, birisi trafiği kesebilirse API anahtarını yakalayabilir ( muhtemelen SSL kullanıyor olsanız bile ).

Bunu başarmanın iki temel yolunu görebiliyorum, her ikisi de konuşlandırılmış uygulamanıza özel API anahtarınızı içermiyor:

Her dağıtım için benzersiz bir API anahtarı edinin

Bu, satıcı ile anahtarlar elde edebileceğiniz veya müşterilerinizin anahtarları edinmesini sağlayabileceğiniz bazı ek ilişkiler gerektirir.

Bu, örneğin Google Haritalar API'sını kullanan ürünlerde aslında oldukça yaygındır. Yazılımın yaratıcısı, kopyasını geliştirirken / çalıştırırken kullandıkları kendi anahtarlarına sahiptir, ancak yazılımı yazılıma dahil etmez ve bunun yerine, söz konusu yazılımı yükleyen kullanıcı olarak Google'a gidip kendi API'nizi edinmenizi gerektirir tuşuna basın. Yazılımın yalnızca Google Maps API anahtarını kullanacak şekilde ayarlamak için bir yapılandırma seçeneği vardır.

Aslında, API anahtarları yayınlayan birçok tedarikçi, bu şekilde bir şeyler yapmanızı gerektirir, bu nedenle yine de yanlış yolda olabilirsiniz ve bu, satıcının Hizmet Şartları'na göre kullanmanıza izin verilen tek çözüm olabilir ve / veya onlarla sahip olabileceğiniz yasal sözleşmeler.

Proxy kullanın

Uygulamanızın API'larınızı (sunucularınızda) çağırdığı bir proxy API ayarlayın ve karşılığında API'nız anahtarı kullanarak satıcının API'sını arar.

API'nız üzerinde ek korumaya ihtiyacınız olabilir, örneğin, yalnızca uygulamanızın onu kullandığından emin olmak için bir şey. Bu şu şekilde yapılabilir:

  • işlevselliği o kadar özel bir şey haline getirmez ki uygulamanız bunu kullanabilir
  • IP beyaz listeleri
  • Sunucularınız için halihazırda sahip olduğunuz bazı mevcut lisanslama / yetkilendirme mekanizması
  • Müşterilerinize anahtarlar verebileceğiniz kendi API anahtar sisteminiz

Burada akılda tutulması gereken şey, bunu yapmanıza izin verilmeyebilir. Satıcınız bir "birleştirme hizmeti" veya proxy oluşturmanızı engelleyen Hizmet Şartları'na veya yasal sözleşmelere sahip olabilir, bu nedenle bunu kontrol etmeniz gerekir.


Hatalı Davranışı Ele Alma

Anahtarınız tehlikeye atılmasa bile, müşterilerinizden biri satıcının anahtarınızı engellemesine neden olan bir şey yapıyorsa, birdenbire TÜM müşterileriniz devre dışı bırakılır ve tek çözüm diğer herkesi güncellemektir.

Benzer şekilde, sen senin müşterilerinden biri engellemek istediğiniz o zaman herkes için bir güncelleme veren ve ardından tuşuna devre dışı bırakmadan bunu yapamaz (örneğin, bunlar, vs, yazılım korsan gelmiş ödeme durduruldu).

Bunun bir avuç müşterinin ötesindeki herhangi bir şeyin lojistiği hızla savunulamaz hale gelecektir.

Proxy olarak hareket ediyor ya da her kurulum için benzersiz bir anahtarınız olsun, bu durumlardan herhangi birini nispeten kolayca (ve başkalarına çok az etkisi olan veya hiç etkisi olmayan) halledebilirsiniz.


Yazılımınıza gömülü iken anahtarı korumaya çalışmak nihayetinde boşuna bir çabadır. Ne yaparsanız yapın, ikili, kaynak ve / veya iletişim kanalına erişimi olan ve anahtarına erişebilecek kadar kararlı olan herhangi bir saldırgan bunu yapabilir.

Bu yüzden gömmeyin. "Tek kazanan hamle oynamak değil."


2
+1 "Her bir dağıtım için benzersiz bir API anahtarı edinin." Hatta yaramaz anahtarları / istemcileri devre dışı bırakmak için [sınırlı] yeteneği vererek proxy ile birlikte kullanılabilir.
svidgen

@svidgen Çok iyi bir nokta, bunu tartışan bir bölüm ekledim. Teşekkürler.
gregmac

1
+1, evrensel bir anahtar neredeyse her zaman sizi *** ısırır
Wyatt Barnett

Çok derin tepki. Ne yazık ki, ağ protokolleri ile NDA altında olduğumdan, bu nedenle özel bir anahtarın nedeni olarak, bir anahtar getirmesini istemek sadece bir özel API anahtarı atanır. Proxy de muhtemelen soru dışında. Sadece bir şekilde insan tarafından okunamayan bir biçime dönüştürüp kaynakta bir yere koymak için başvurmam gerekebilir - harika bir seçenek değil, ancak çok fazla seçenek kalmadı.
Spencer

@Spencer "Proxy de muhtemelen" Neden? Bu saçma görünüyor ve anahtarı dağıtmak da NDA'nızı ihlal edecek.
Andy

5

Nesne kodunda bir anahtar varsa, tanım gereği herkese açıktır. Obfuscatorların etrafında nesne kodunu hızlı bir şekilde çürüten saldırılar var. Özel anahtar nesne kodunun dışında ve başka bir dosyada olabilir. Zor kısmı, bu özel anahtarı kullanıcıya sağlamaktır. Sağlandıktan sonra, özel anahtarın bütünlüğünü doğrulamak için dosyanın sonuna yapıştırılmış özel anahtarın imzasını ve uygulama içindeki bir ortak anahtarı kullanabilirsiniz. Güvenli bir iletişim kanalınız varsa bir web sunucusu da bu doğrulamayı yapabilir.

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.