SORU
19 Mart 2012, PAZARTESİ


DİNLENME Belirteç tabanlı kimlik Doğrulama API

Kimlik doğrulaması gerektiren bir REST API geliştiriyorum. HTTP üzerinden harici bir Java eklentisi ile kendisi oluşur kimlik doğrulama çünkü, simgeleri tekrar tekrar kimlik doğrulama hizmeti arama önlemek için bir kenara bırakalım diye gerekçeli. İlk sorum rahatlıkla getiriyor:

Bu gerçekten sadece müşteriler her isteği HTTP Basic Auth kullanmak gerektiren ve Kimlik Doğrulama hizmeti sunucu tarafı aramaları önbelleğe daha iyi olabilir?

Basic Auth çözüm içerik isteklerini başlamadan önce gidiş-dönüş sunucuya tam gerektirmeyen bir avantaja sahiptir. Belirteçleri potansiyel kapsamı (hak verirsiniz kaynakları veya eylemler sadece belirli yani) daha esnek olabilir, ama daha basit kullanımı benim davam daha OAuth içeriği için daha uygun görünüyor.

Şu anda belirteçleri bu şekilde elde edilir:

curl -X POST localhost/token --data "api_key=81169d80...
                                     &verifier=2f5ae51a...
                                     ×tamp=1234567
                                     &user=foo
                                     &pass=bar"

api_key, timestamp verifier tüm istekleri gerekli. "Doğrulayıcı" döndürülür

sha1(timestamp   api_key   shared_secret)

Benim niyetim sadece bilinen partilerden gelen çağrılara izin vermek için, ve verbatim yeniden gelen çağrıları engellemek için.

Bu kadar yeter mi? Underkill? Overkill?

Elinde bir göstergesi olarak, müşterilerine kaynak almak:

curl localhost/posts?api_key=81169d80...
                    &verifier=81169d80...
                    &token=9fUyas64...
                    ×tamp=1234567

En basit Olası arama için bu korkunç bir ayrıntı gibi görünüyor. Düşünen shared_secret rüzgar olmak, gömülü (en az) bir iOS uygulaması olan yapardım gösterebiliyor olması elde edilen bu teklif bile ötesinde yanlış bir anlamda güvenlik?

CEVAP
19 Mart 2012, PAZARTESİ


Bana her şeyi ayrı ve çözelim başına her soruna yaklaşımı:

Kimlik doğrulaması

Kimlik doğrulaması için, baseauth protokolü seviyede olgun bir çözümdür avantajı vardır. Bu çok şeyi anlatıyor< . em ^"daha sonra ürün olabilir"sorunlar zaten çözülür. BaseAuth ile, örneğin, kullanıcı arayüzleri parola önbellek yok öyle bir şifredir.

Auth server yük

Eğer sunucu üzerinde kimlik doğrulaması önbellekleme yerine kullanıcı için bir belirteç es geçerek, yine aynı şeyi yapıyorsun: Önbellekleme kimlik bilgileri. Tek fark kullanıcı için önbelleğe alma sorumluluğunu dönüyor. Bu kazanımlar ile kullanıcı için gereksiz bir iş gibi görünüyor, senin de önerdiğin gibi bu şeffaf sunucuda işlemek için tavsiye ederim.

İletim Güvenlik

Eğer bir SSL bağlantısı varsa, bu bağlantı güvenli*. Yanlışlıkla birden fazla yürütme önlemek için, birden fazla URL filtre veya kullanıcılar rasgele bir bileşeni dahil etmek isteyebilir ("") sonuç URL.

url = username:key@myhost.com/api/call/nonce

Bu mümkün değil ve iletilen bilgiler gizli değilse, token yaklaşım içinde senin de önerdiğin gibi karma ile güvence isteği, tavsiye ederim. Karma güvenlik sağladığından, kullanıcıların baseauth parolasıyla karma sağlamak için talimat olabilir. Geliştirilmiş sağlamlık için, "" tekrar saldırı (iki meşru istekleri aynı ikinci sırasında yapılmış olabilir) önlemek için. sonuç olarak zaman damgası yerine rasgele bir dize kullanmanızı tavsiye ederiz Yerine sağlayan ayrı "paylaşılan gizli" ve "apı anahtarı" alanlar, sadece apı anahtarı olarak paylaşılan gizli, ve sonra bir tuz olduğunu değiştirmez önlemek için gökkuşağı tablo saldırı. Kullanıcı adı alanı için iyi bir yer gibi auth bir parçası olduğu için sonuç çok koymuş gibi görünüyor. Şimdi böyle temiz bir çağrı var:

nonce = generate_secure_password(length: 16);
one_time_key = nonce   '-'   sha1(nonce salt shared_key);
url = username:one_time_key@myhost.com/api/call

Bu biraz zahmetli olduğu doğrudur. Bu Protokol düzeyinde bir çözüm (SSL) kullanarak değil çünkü. En azından kendilerini gitmek zorunda değilsiniz bu yüzden kullanıcılar için SDK tür sağlamak için iyi bir fikir olabilir. Eğer bu şekilde yapmak istiyorsanız, güvenlik uygun-doğru-öldür () seviyede buluyorum.

Gizli depolama güvenli

Önlemek için çalışırken, senin kim olduğuna göre değişir. Eğer sizi engelleyen insanlarla erişmek için kullanıcının telefonu kullanarak DİNLENME hizmeti kullanıcı ismi, o zaman iyi bir fikir olabilir bulmak için bir çeşit Anahtarlık API hedef OS ve SDK (veya uygulayıcı) mağaza anahtar var. Eğer bu mümkün değilse, en azından biraz daha zor şifreleme ve ayrı yerlerde veri şifrelenmiş ve şifreleme anahtarı saklayarak gizli bilgileri almak için yapabilirsiniz.

Eğer diğer müşteriler gelişimini önlemek için API anahtarı almak diğer yazılım satıcıları tutmak için çalışıyorsanız, sadece şifrelemek ve saklamak ayrı bir yaklaşımneredeyseçalışır. Bu whitebox kripto ve bugüne kadar hiç kimse bu sınıfın sorunları için gerçekten güvenli bir çözüm ile geldi. En azından hala istismar anahtarları ban, böylece her kullanıcı için tek bir anahtar konudur.

(*) DÜZENLEME:SSL bağlantıları 14* *taking additional steps to verify onlar olmadan.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Outler

    Adam Outler

    19 EKİM 2006
  • HTC Tutorials

    HTC Tutorial

    21 EYLÜL 2010
  • Mary Jane Tauyan

    Mary Jane Ta

    20 AĞUSTOS 2009