Web API Güvenlik

4 Cevap php

I'm asked to write a Web API for an application (pc executable, not web-app) that will allow sending emails.
A user clicks something, the app communicates with the API which generates an email and sends it out.

Eminim kimsenin izinsiz API erişimi olacak yapmak zorunda, bu yüzden kimlik çeşit yapmak gerekiyor ve ben nasıl doğru bir şekilde yapmak için bir fikrim yok.

API erişen daha uygulamalar olacak.

Kullanıcı adı ve şifre göndermek, ama bu gerçekten sorunu çözmek değil - ilk düşünce oldu. Birisi uygulamayı decompiles, onlar istek url ve kullanıcı / parola dahil değişkenleri olacak ya da sadece sadece kokladı olabilir çünkü.

bu yüzden ... Ben ne seçenekler var?

Ben, güvenli bağlantı (SSL) bana şu anda mevcut değil, ama yine de, bu Dekompilasyon soruna karşı bana yardım etmeyecek oldukça emin olacak mı?


EDIT

Ben başlangıçta dedi, ama değil the user will not be asked for the username/password. Bu uygulama (lar) kullanıcıları, kimlik doğrulaması gereken olacak uygulama (lar) var.

4 Cevap

Ben OAuth kontrol öneriyoruz. bu kesinlikle API erişmek için araçlarını yetki ile güvenlik sorunlarını çözmek size yardımcı olmalıdır.

http://oauth.net

Yazılımınızın dağılımı gerçekten sorunun dönüm noktası olduğunu. Ya bir API sunucusuna erişmek için çalışmak gibi kullanıcı adları ve şifreleri karma ve yazılım saklayarak, un-karma değerlerini saklamak daha bir daha kullanışlı değildir. Eğer kullanıcılar için kullanıcı adlarını ve şifreleri uygulamak için gidiyoruz, ben size yazılımın kendisi değerleri kaydetmeden API kontrolü için bir ön-imleç olarak kullanmayın düşünüyorum. Bana iki parça bu tarif edelim.

Request Signatures

API isteği doğrulama için kullanımı en yaygın yöntemdir request signatures. A bir API sunucusuna gönderilmeden önce, temelde, isteğe parametreler sıralanır ve benzersiz bir anahtar karışıma ilave edilir. Sürü daha sonra isteğe ek olarak bir karma üretmek için kullanılır. Örneğin:

public static function generateRequestString(array $params, $secretKey)
{
    $params['signature'] = self::generateSignature($params, $secretKey);
    return http_build_query($params,'','&');
}

public static function generateSignature($secretKey, array $params)
{
    $reqString = $secretKey;
    ksort($params);
    foreach($params as $k => $v)
    {
        $reqString .= $k . $v;
    }
    return md5($reqString);
}

Siz sadece göndermek istediği tüm parametrelerin bir dizi generateRequestString() yöntemini çağırarak yukarıdaki kodu kullanarak bir API isteği sorgu dizesi oluşturmak olabilir. Gizli anahtar API her kullanıcıya benzersiz sağlanır şeydir. Genellikle imza ile birlikte API sunucusuna kullanıcı kimliği geçmek ve API sunucu yerel veritabanından gizli anahtarı almak ve bunu inşa aynı şekilde isteği doğrulamak için id kullanır. Anahtar ve kullanıcı kimliği doğru olduğunu varsayarak, bu kullanıcı doğru imzayı oluşturmak mümkün tek olmalıdır. Anahtar API isteğinde geçti hiç unutmayın.

Ne yazık ki, bu masaüstü uygulaması için bir sorundur eşsiz bir anahtar var her kullanıcı gerektirir. Hangi iki adıma beni açar.

Temporal Keys

Yani decompiled olabilir çünkü uygulama ile anahtarlarını dağıtmak değil, ve tuşları çıkmak istiyorum. Eğer çok kısa ömürlü tuşları yapabilir,-hareket karşı.

Eğer kendi kullanıcı adı ve şifresi için kullanıcılar ister masaüstü uygulaması bir kısmını uyguladık varsayılarak, uygulama sunucusu bir kimlik doğrulama isteği gerçekleştirmek olabilir. Başarılı bir kimlik üzerinde, masaüstü uygulaması daha sonra yetkili oturumu ömrü boyunca saklamak yanıt ile bir geçici anahtarı dönebileceğini ve API istekleri için kullanın. Eğer SSL, bu initial authentication is the most vulnerable part kullanamazsınız sözü, çünkü bazı kısıtlamalarla yaşamak zorunda.

Önerilen makale Andy E iyi bir yaklaşım (ben o kadar oy) olduğunu. Temelde doğrulamak için kullanılabilecek bir kısa ömürlü anahtar kurmak için bir el sıkışma. Aynı anahtar imza karma için kullanılabilir. Ayrıca şansa ve sadece kullanıcı adı / şifre şifrelenmemiş göndermek ve (yalnızca bir kez olur) zamansal bir anahtarı almak, ama bunu kokladı olabilir farkında olmak gerekiyor olabilir.

Summary

Eğer zamansal bir oturum anahtarı kurabilir, size decompiled olabilir istemci programda bir şey saklamak zorunda kalmazsınız. Sunucuya bir kez gönderilen bir kullanıcı adı / parola kurmak için yeterli olmalıdır. Eğer bu anahtarı var sonra, masaüstü uygulamalar istekleri oluşturmak için kullanabilirsiniz, ve API sunucu üzerindeki talepleri kontrol edebilirsiniz.

Birisi her zaman koda ve değişkenler için avlamak mümkün olacak. Bir obfuscator biraz daha iyi bunları gizlemek mümkün olabilir. Eğer (ama açıkçası bu anahtar istemci uygulamasında saklanır) isteği verileri istemci tarafı şifrelemek ve sunucu tarafı şifresini çözmek için özel ve kamu anahtar kümesi use sürece Sniffing SSL olmadan da kolaydır.

Yapılacak en iyi şey, size güvenli bir bağlantı oluşturma ve kod obfuscating, ihtiyacınız olacaktır düşünüyorum koruma gibi birçok katmanı sağlamaktır. Sen SSL kullanmadan güvenli bir bağlantı gösterir aşağıdaki makalede, bakmak olabilir:

http://www.codeproject.com/KB/security/SecureStream.aspx

mattjames belirtildiği gibi, düz metin biçiminde şifreleri saklamak asla. Kullanıcı uygulamaya parolasını girdiğinde, şifre karma saklayın. Aynı karma sunucuda saklanmalıdır. Bu şekilde, karma bir dinleyici tarafından görülür eğer, en azından kullanıcının orijinal şifre görmek olmaz.

Eğer API ağ üzerinden app gönderilen düz metin parola görmesini engellemek için gerekirse SSL kullanmanız gerekecektir.

Decompilation sorunu için, API, değil orijinal şifre içinde şifre karma saklamak isterim. Burada açıklama Bkz: http://phpsec.org/articles/2005/password-hashing.html.