Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, Windows'un bir parçası olarak sunulan Windows Hello teknolojisi açıklanır ve geliştiricilerin Windows uygulamalarını ve arka uç hizmetlerini korumak için bu teknolojiyi nasıl uygulayabilecekleri açıklanır. Bu teknolojilerin geleneksel kimlik bilgilerinin kullanılmasından kaynaklanan tehditleri azaltmaya yardımcı olan belirli özelliklerini vurgular ve bu teknolojileri bir Windows istemci dağıtımının parçası olarak tasarlama ve dağıtma hakkında rehberlik sağlar.
Uyarı
Bu makale, uygulama geliştirmeye odaklanmaktadır. Windows Hello'nun mimari ve uygulama ayrıntıları hakkında bilgi için bkz. İş için Windows Hello dağıtımı planlama.
Windows Hello'yu ve kimlik doğrulama hizmetini kullanarak WinUI uygulaması oluşturma konusunda adım adım izlenecek yol için Windows Hello oturum açma uygulaması ve Windows Hello oturum açma hizmeti makalelerine bakın.
Giriş
Bilgi güvenliği hakkında temel bir varsayım, bir sistemin bunu kimin kullandığını belirleyebileceğidir. Bir kullanıcıyı tanımlamak, sistemin kullanıcının uygun şekilde tanımlanıp tanımlanmayacağına (kimlik doğrulaması olarak bilinen bir işlem) karar vermesine ve ardından doğru kimliği doğrulanmış bir kullanıcının ne (yetkilendirme) yapabilmesi gerektiğine karar vermesine olanak tanır. Dünya genelinde dağıtılan bilgisayar sistemlerinin büyük çoğunluğu, kimlik doğrulaması ve yetkilendirme kararları almak için kullanıcı kimlik bilgilerine bağlıdır. Bu, bu sistemlerin güvenlikleri için temel olarak yeniden kullanılabilir, kullanıcı tarafından oluşturulan parolalara bağımlı olduğu anlamına gelir. Kimlik doğrulamasının "bildiğiniz bir şey, sahip olduğunuz bir şey veya olduğunuz bir şey" içerebileceği şeklindeki sıkça alıntılanan özdeyiş, sorunu net bir şekilde özetler: Yeniden kullanılabilir bir parola tek başına bir kimlik doğrulama faktörüdür, bu nedenle parolayı bilen herkes bu parolanın sahibi olan kullanıcının yerine geçebilir.
Geleneksel kimlik bilgileriyle ilgili sorunlar
1960'ların ortasından beri, Fernando Corbató ve Massachusetts Teknoloji Enstitüsü'ndeki ekibi parolanın tanıtılmasında şampiyonluk kazandıklarında, kullanıcılar ve yöneticiler kullanıcı kimlik doğrulaması ve yetkilendirme için parola kullanımıyla ilgilenmek zorunda kaldılar. Zaman içinde, parola depolama ve kullanım için son teknoloji biraz gelişmiştir (örneğin, güvenli karma ve tuzlama ile), ancak yine de iki sorunla karşı karşıyayız. Parolaları kopyalamak ve çalmak kolaydır. Buna ek olarak, uygulama hataları onları güvensiz hale getirebilir ve kullanıcılar kolaylık ve güvenliği dengelemede zorlanabilir.
Kimlik bilgisi hırsızlığı
Parolaların en büyük riski basittir: Saldırgan bunları kolayca çalabilir. Parola girilmiş, işlenmiş veya depolanmış her yerde güvenlik açığı vardır. Örneğin, bir saldırgan bir uygulama sunucusuna ağ trafiğini dinleyerek, bir uygulamaya veya cihaza kötü amaçlı yazılım yükleyerek, bir cihazda kullanıcının tuş vuruşlarını kaydederek veya bir kullanıcının hangi karakterleri yazdığını izleyerek bir kimlik doğrulama sunucusundan parola veya özet koleksiyonu çalabilir. Bunlar yalnızca en yaygın saldırı yöntemleridir.
Diğer bir ilgili risk, bir saldırganın güvensiz bir ağda gözetleyerek geçerli bir kimlik bilgisini yakalaması ve daha sonra geçerli bir kullanıcının kimliğine bürünmek için yeniden kullanması riskidir. Çoğu kimlik doğrulama protokolü (Kerberos ve OAuth dahil) kimlik bilgisi değişim işlemine bir zaman damgası ekleyerek yeniden yürütme saldırılarına karşı koruma sağlar, ancak bu taktik yalnızca kimlik doğrulama sisteminin verdiği belirteci korur, kullanıcının bileti almak için sağladığı parolayı korumaz.
Kimlik bilgisi yeniden kullanımı
Kullanıcı adı olarak bir e-posta adresi kullanmanın yaygın yaklaşımı, kötü bir sorunu daha kötü hale getirir. Güvenliği aşılmış bir sistemden kullanıcı adı-parola çiftlerini başarıyla kurtaran bir saldırgan, aynı çifti diğer sistemlerde de deneyebilir. Bu taktik, saldırganların güvenliği aşılmış bir sistemden diğer sistemlere sıçramasına olanak sağlamak için şaşırtıcı bir şekilde çalışır. E-posta adreslerinin kullanıcı adı olarak kullanılması, bu kılavuzun ilerleyen bölümlerinde inceleyebileceğimiz ek sorunlara yol açar.
Kimlik bilgileri sorunlarını çözme
Parolaların oluşturduğu sorunları çözmek zordur. Parola ilkelerinin tek başına sıkılaştırılması bunu yapmaz; kullanıcılar yalnızca parolaları geri dönüştürebilir, paylaşabilir veya yazabilir. Kimlik doğrulaması güvenliği için kullanıcı eğitimi kritik öneme sahip olsa da, tek başına eğitim de sorunu ortadan kaldırmaz.
Windows Hello, mevcut kimlik bilgilerini doğrulayarak ve biyometrik veya PIN tabanlı bir kullanıcı hareketinin koruduğu cihaza özgü bir kimlik bilgisi oluşturarak parolaları güçlü iki öğeli kimlik doğrulamasıyla (2FA) değiştirir.
Windows Hello nedir?
Windows Hello, windows'da yerleşik olarak bulunan ve cihazınızın kilidini açmak için yüzünüzü, parmak izinizi veya PIN'inizi kullanmanıza olanak tanıyan bir biyometrik oturum açma sistemidir. Geleneksel parolaları daha güvenli ve kullanışlı bir yöntemle değiştirir. Biyometrik verileriniz cihazınızda güvenli bir şekilde depolanır ve birisi cihazınızı çalsa bile PIN'iniz veya biyometrik hareketleriniz olmadan erişemez. Kilidi açtıktan sonra uygulamalarınıza, verilerinize ve hizmetlerinize sorunsuz bir şekilde erişebilirsiniz.
Windows Hello kimlik doğrulayıcısı Hello olarak bilinir. Her Hello, belirli bir kullanıcı ve cihaza özeldir. Cihazlar arasında eşitlenmez veya sunucularla veya uygulamalarla veri paylaşmaz. Aynı cihazı birden çok kişi kullanıyorsa, her kişinin kendi Windows Hello yapılandırmasını ayarlaması gerekir. Bu yapılandırma, söz konusu cihazdaki kimlik bilgilerine bağlıdır. Hello'yu, daha sonra uygulamalarda veya hizmetlerde oturum açmak için kullanılan, depolanan kimlik bilgilerinizin kilidini açan bir anahtar olarak düşünün. Kimlik bilgilerinin kendisi değildir, ancak kimlik doğrulaması sırasında ikinci bir güvenlik katmanı görevi görür.
Windows Hello kimlik doğrulaması
Windows Hello, bir cihazın tek bir kullanıcıyı tanıması için sağlam bir yol sağlar. Bu yöntem, bir kullanıcı ile istenen hizmet veya veri öğesi arasındaki yolun ilk bölümünü ele alır. Cihaz kullanıcıyı tanıydıktan sonra, istenen kaynağa erişim verilip verilmeyeceğini belirlemeden önce kullanıcının kimliğini doğrulamalıdır. Windows Hello, Windows ile tamamen tümleştirilmiş güçlü bir iki faktörlü kimlik doğrulama (2FA) sağlar ve yeniden kullanılabilir parolaları spesifik bir cihazın bir kombinasyonu ile biyometrik bir hareket veya PIN kullanarak değiştirir.
Ancak Windows Hello yalnızca geleneksel 2FA sistemlerinin yerine geçmiyor. Kavramsal olarak akıllı kartlara benzer: Kimlik doğrulaması, dize karşılaştırmaları yerine şifreleme temelleri kullanılarak gerçekleştirilir ve kullanıcının anahtar malzemesi kurcalamaya dayanıklı donanım içinde güvenlidir. Windows Hello, akıllı kart dağıtımı için gereken ek altyapı bileşenlerini de gerektirmez. Özellikle, şu anda bir sertifikanız yoksa sertifikaları yönetmek için Ortak Anahtar Altyapısına (PKI) ihtiyacınız yoktur. Windows Hello, hiçbir dezavantajı olmadan akıllı kartların başlıca avantajlarını (sanal akıllı kartlar için dağıtım esnekliği ve fiziksel akıllı kartlar için sağlam güvenlik) birleştirir.
Windows Hello nasıl çalışır?
Kullanıcı kendi makinesinde Windows Hello'yu ayarlarken cihazda yeni bir ortak-özel anahtar çifti oluşturur. Güvenilen platform modülü (TPM) bu özel anahtarı oluşturur ve korur. Cihazda TPM yongası yoksa özel anahtar şifrelenir ve yazılım tarafından korunur. Ayrıca TPM özellikli cihazlar, bir anahtarın TPM'ye bağlı olduğunu kanıtlamada kullanılabilecek bir veri bloğu oluşturur. Bu kanıtlama bilgileri, örneğin kullanıcıya farklı bir yetkilendirme düzeyi verilip verilmeyeceğine karar vermek için çözümünüzde kullanılabilir.
Bir cihazda Windows Hello'yu etkinleştirmek için kullanıcının Windows ayarlarında Microsoft Entra ID hesabına veya Microsoft Hesabına bağlı olması gerekir.
Anahtarlar nasıl korunur?
Anahtar malzeme her oluşturulduğunda, saldırılara karşı korunmalıdır. Bunu yapmak için en güçlü yol özel donanım kullanmaktır. Güvenlik açısından kritik uygulamalar için anahtar oluşturmak, depolamak ve işlemek için donanım güvenlik modüllerini (HSM) kullanmanın uzun bir geçmişi vardır. Akıllı kartlar, Güvenilen Bilgi İşlem Grubu TPM standardıyla uyumlu cihazlar gibi özel bir HSM türüdür. Mümkün olduğunda, Windows Hello'nun uygulanması anahtarları oluşturmak, depolamak ve işlemek için yerleşik TPM donanımından yararlanır. Ancak, Windows Hello ve İş için Windows Hello, yerleşik bir TPM gerektirmez.
Uygun olduğunda, Microsoft TPM donanımının kullanılmasını önerir. TPM, PIN deneme yanılma saldırıları da dahil olmak üzere çeşitli bilinen ve olası saldırılara karşı koruma sağlar. TPM, hesap kilitlenmesinin ardından ek bir koruma katmanı da sağlar. TPM anahtar malzemeyi kilitlediğinde, kullanıcının PIN'i sıfırlaması gerekir. PIN'in sıfırlanması, eski anahtar malzemesiyle şifrelenmiş tüm anahtarların ve sertifikaların kaldırılacağı anlamına gelir.
Kimlik doğrulama
Kullanıcı korumalı anahtar malzemesine erişmek istediğinde, kimlik doğrulama işlemi kullanıcının cihazın kilidini açmak için bir PIN veya biyometrik hareket girmesiyle başlar ve bu işlem bazen "anahtarı serbest bırakma" olarak adlandırılır.
Bir uygulama hiçbir zaman başka bir uygulamadaki anahtarları kullanamaz veya başka bir kullanıcının anahtarlarını kullanamaz. Bu anahtarlar, kimlik sağlayıcısına veya IDP'ye gönderilen ve belirtilen kaynaklara erişim arayan istekleri imzalamak için kullanılır. Uygulamalar belirli eylemler için önemli malzeme gerektiren işlemler istemek için belirli API'leri kullanabilir. Bu API'ler aracılığıyla erişim için kullanıcı hareketi aracılığıyla açık doğrulama gerekir ve anahtar malzeme istekte bulunan uygulamaya sunulmaz. Uygulama bunun yerine, bir veri parçasını imzalama gibi belirli bir eylem ister ve Windows Hello katmanı gerçek işi işler ve sonuçları döndürür.
Windows Hello'yu uygulamaya hazırlanma
Artık Windows Hello'nun nasıl çalıştığı hakkında temel bilgilere sahip olduğumuza göre, bunları kendi uygulamalarımızda nasıl uygulayacağımıza göz atalım.
Windows Hello kullanarak uygulayabileceğiniz farklı senaryolar vardır. Örneğin, yalnızca bir cihazda uygulamanızda oturum açın. Diğer yaygın senaryo, bir hizmette kimlik doğrulaması yapmaktır. Oturum açma adı ve parola kullanmak yerine Windows Hello kullanacaksınız. Aşağıdaki bölümlerde, Windows Hello ile hizmetlerinizde kimlik doğrulaması gerçekleştirme ve mevcut bir kullanıcı adı/parola sisteminden Windows Hello sistemine dönüştürme gibi birkaç farklı senaryoyu ele alacaktır.
Windows Hello'yu Uygulama
Bu bölümde, mevcut kimlik doğrulama sistemi olmayan bir yeşil alan senaryosuyla başlayacağız ve Windows Hello'yu nasıl uygulayacağımızı açıklayacağız.
Sonraki bölümde mevcut bir kullanıcı adı/parola sisteminden geçiş yapılır. Ancak, bu bölüm sizi daha çok ilgilendirse bile, işlemi ve gerekli kodu temel olarak anlamak için bu bölümü gözden geçirmek isteyebilirsiniz.
Yeni kullanıcıları kaydetme
Windows Hello'yu kullanacak yepyeni bir hizmet ve yeni bir cihaza kaydolmaya hazır olan varsayımsal yeni bir kullanıcıyla başlıyoruz.
İlk adım, kullanıcının Windows Hello'yu kullanabileceğini doğrulamaktır. Uygulama, kullanıcı kimliği anahtarları oluşturadığından emin olmak için kullanıcı ayarlarını ve makine özelliklerini doğrular. Uygulama kullanıcının Windows Hello'yu henüz etkinleştirmediğini belirlerse, kullanıcıdan uygulamayı kullanmadan önce bunu ayarlamasını ister.
Windows Hello'yu etkinleştirmek için, kullanıcının Kutudan Çıkış Deneyimi (OOBE) sırasında kurmadığı sürece Windows ayarlarında bir PIN kurması gerekir.
Aşağıdaki kod satırları, kullanıcının Windows Hello için ayarlı olup olmadığını denetlemenin basit bir yolunu gösterir.
var keyCredentialAvailable = await KeyCredentialManager.IsSupportedAsync();
if (!keyCredentialAvailable)
{
// User didn't set up PIN yet
return;
}
Sonraki adım, kullanıcıdan hizmetinize kaydolması için bilgi istemektir. Kullanıcıdan ad, soyadı, e-posta adresi ve benzersiz bir kullanıcı adı isteyebilirsiniz. E-posta adresini benzersiz tanımlayıcı olarak kullanabilirsiniz; Bu size bağlı.
Bu senaryoda, kullanıcının benzersiz tanımlayıcısı olarak e-posta adresini kullanırız. Kullanıcı kaydoldıktan sonra, adresin geçerli olduğundan emin olmak için bir doğrulama e-postası göndermeyi düşünmelisiniz. Bu, gerekirse hesabı sıfırlamak için bir mekanizma sağlar.
Kullanıcı PIN'ini ayarladıysa, uygulama kullanıcının KeyCredential değerini oluşturur. Uygulama ayrıca, anahtarın TPM üzerinde oluşturulduğuna dair şifreleme kanıtı almak için isteğe bağlı anahtar kanıtlama bilgilerini de alır. Oluşturulan ortak anahtar ve isteğe bağlı olarak kanıtlama, kullanılan cihazı kaydetmek için arka uç sunucusuna gönderilir. Her cihazda oluşturulan her anahtar çifti benzersiz olacaktır.
KeyCredential'ı oluşturma kodu aşağıdaki gibi görünür:
var keyCreationResult = await KeyCredentialManager.RequestCreateAsync(
AccountId, KeyCredentialCreationOption.ReplaceExisting);
RequestCreateAsync, ortak ve özel anahtarı oluşturan çağrıdır. Cihaz doğru TPM yongasına sahipse, API'ler TPM yongasının özel ve ortak anahtarı oluşturmasını ve sonucu depolamasını isteyecektir; TPM yongası yoksa işletim sistemi kodda anahtar çiftini oluşturur. Uygulamanın oluşturulan özel anahtarlara doğrudan erişmesinin bir yolu yoktur. Anahtar çiftlerinin oluşturulmasının bir parçası da sonuçta elde edilen Kanıtlama bilgileridir. (Kanıtlama hakkında daha fazla bilgi için sonraki bölüme bakın.)
Cihazda anahtar çifti ve kanıtlama bilgileri oluşturulduktan sonra ortak anahtarın, isteğe bağlı kanıtlama bilgilerinin ve benzersiz tanımlayıcının (e-posta adresi gibi) arka uç kayıt hizmetine gönderilmesi ve arka uçta depolanması gerekir.
Kullanıcının uygulamaya birden çok cihazda erişmesine izin vermek için arka uç hizmetinin aynı kullanıcı için birden çok anahtar depolayabilmesi gerekir. Her anahtar her cihaz için benzersiz olduğundan, tüm bu anahtarları aynı kullanıcıya bağlı olarak depolayacağız. Cihaz tanımlayıcısı, kullanıcıların kimliğini doğrularken sunucu bölümünü iyileştirmeye yardımcı olmak için kullanılır. Bundan sonraki bölümde daha ayrıntılı olarak bahsedeceğiz.
Bu bilgileri arka uçta depolamak için örnek bir veritabanı şeması aşağıdaki gibi görünebilir:
Kayıt mantığı şöyle görünebilir:
Topladığınız kayıt bilgileri elbette bu basit senaryoya dahil ettiğimizden çok daha fazla tanımlayıcı bilgi içerebilir. Örneğin, uygulamanız bankacılık hizmeti gibi güvenli bir hizmete erişiyorsa kaydolma işleminin bir parçası olarak kimlik kanıtı ve diğer şeyler istemeniz gerekir. Tüm koşullar karşılandığında, bu kullanıcının ortak anahtarı arka uçta depolanır ve kullanıcının hizmeti bir sonraki kullanışında doğrulamak için kullanılır.
using System;
using System.Runtime;
using System.Threading.Tasks;
using Windows.Storage.Streams;
using Windows.Security.Credentials;
static async void RegisterUser(string AccountId)
{
var keyCredentialAvailable = await KeyCredentialManager.IsSupportedAsync();
if (!keyCredentialAvailable)
{
// The user didn't set up a PIN yet
return;
}
var keyCreationResult = await KeyCredentialManager.RequestCreateAsync(AccountId, KeyCredentialCreationOption.ReplaceExisting);
if (keyCreationResult.Status == KeyCredentialStatus.Success)
{
var userKey = keyCreationResult.Credential;
var publicKey = userKey.RetrievePublicKey();
var keyAttestationResult = await userKey.GetAttestationAsync();
IBuffer keyAttestation = null;
IBuffer certificateChain = null;
bool keyAttestationIncluded = false;
bool keyAttestationCanBeRetrievedLater = false;
keyAttestationResult = await userKey.GetAttestationAsync();
KeyCredentialAttestationStatus keyAttestationRetryType = 0;
switch (keyAttestationResult.Status)
{
case KeyCredentialAttestationStatus.Success:
keyAttestationIncluded = true;
keyAttestation = keyAttestationResult.AttestationBuffer;
certificateChain = keyAttestationResult.CertificateChainBuffer;
break;
case KeyCredentialAttestationStatus.TemporaryFailure:
keyAttestationRetryType = KeyCredentialAttestationStatus.TemporaryFailure;
keyAttestationCanBeRetrievedLater = true;
break;
case KeyCredentialAttestationStatus.NotSupported:
keyAttestationRetryType = KeyCredentialAttestationStatus.NotSupported;
keyAttestationCanBeRetrievedLater = true;
break;
}
}
else if (keyCreationResult.Status == KeyCredentialStatus.UserCanceled ||
keyCreationResult.Status == KeyCredentialStatus.UserPrefersPassword)
{
// Show error message to the user to get confirmation that user
// does not want to enroll.
}
}
Kanıtlama
Anahtar çiftini oluştururken, TPM yongası tarafından oluşturulan kanıtlama bilgilerini isteme seçeneği de vardır. Bu isteğe bağlı bilgiler, kaydolma işleminin bir parçası olarak sunucuya gönderilebilir. TPM anahtarı kanıtlama, bir anahtarın TPM'ye bağlı olduğunu kriptografik olarak kanıtlayan bir protokoldür. Bu tür bir kanıtlama, belirli bir bilgisayarın TPM'sinde belirli bir şifreleme işleminin gerçekleştiğini garanti etmek için kullanılabilir.
Oluşturulan RSA anahtarını, kanıtlama deyimini ve AIK sertifikasını aldığında, sunucu aşağıdaki koşulları doğrular:
- AIK sertifika imzası geçerli.
- AIK sertifikası güvenilir bir köke bağlanır.
- AIK sertifikası ve zinciri EKU OID "2.23.133.8.3" ("Kanıtlama Kimlik Anahtarı Sertifikası") için etkinleştirilmiştir.
- AIK sertifikasının süresi geçerlidir.
- Çıkaran CA sertifikalarının tamamı zincirde zaman açısından geçerlidir ve iptal edilmemiştir.
- Kanıtlama deyimi doğru şekilde oluşturulmuştur.
- KeyAttestation blobundaki imzada AIK ortak anahtarı kullanılır.
- KeyAttestation blobunda bulunan ortak anahtar, istemcinin kanıtlama deyimiyle birlikte gönderdiği ortak RSA anahtarıyla eşleşir.
Uygulamanız, bu koşullara bağlı olarak kullanıcıya farklı bir yetkilendirme düzeyi atayabilir. Örneğin, bu denetimlerden biri başarısız olursa, kullanıcıyı kaydetmeyebilir veya kullanıcının yapabileceklerini sınırlayabilir.
Windows Hello ile oturum açma
Kullanıcı sisteminize kaydolduktan sonra uygulamayı kullanabilir. Senaryoya bağlı olarak, kullanıcılardan uygulamayı kullanmaya başlamadan önce kimlik doğrulaması yapmasını isteyebilir veya arka uç hizmetlerinizi kullanmaya başladıklarında kimlik doğrulamalarını isteyebilirsiniz.
Kullanıcıyı yeniden oturum açmaya zorlama
Bazı senaryolarda, uygulamaya erişmeden önce veya bazen uygulamanızın içinde belirli bir eylemi gerçekleştirmeden önce kullanıcının o anda oturum açmış olan kişi olduğunu kanıtlamasını isteyebilirsiniz. Örneğin, bir bankacılık uygulaması transfer para komutunu sunucuya göndermeden önce, bir işlem gerçekleştirmeye çalışan, oturum açmış bir cihaz bulan biri yerine kullanıcının olduğundan emin olmak istersiniz. UserConsentVerifier sınıfını kullanarak kullanıcıyı uygulamanızda yeniden oturum açmaya zorlayabilirsiniz. Aşağıdaki kod satırı kullanıcıyı kimlik bilgilerini girmeye zorlar.
Aşağıdaki kod satırı kullanıcıyı kimlik bilgilerini girmeye zorlar.
UserConsentVerificationResult consentResult = await UserConsentVerifier.RequestVerificationAsync("userMessage");
if (consentResult.Equals(UserConsentVerificationResult.Verified))
{
// continue
}
Kullanıcının PIN kodunu veya biyometrik kimlik bilgilerini girmesini gerektiren sunucudan sınama yanıtı mekanizmasını da kullanabilirsiniz. Bu, geliştirici olarak uygulamanız gereken senaryoya bağlıdır. Bu mekanizma aşağıdaki bölümde açıklanmıştır.
Arka uçta kimlik doğrulaması
Uygulama korumalı bir arka uç hizmetine erişmeye çalıştığında, hizmet uygulamaya bir sınama gönderir. Uygulama, sınamayı imzalamak için kullanıcının özel anahtarını kullanır ve sunucuya geri gönderir. Sunucu bu kullanıcının ortak anahtarını depoladığından, iletinin gerçekten doğru özel anahtarla imzalandığından emin olmak için standart şifreleme API'lerini kullanır. İstemcide, imzalama Windows Hello API'leri tarafından yapılır; geliştirici hiçbir kullanıcının özel anahtarına erişemez.
Anahtar denetimine ek olarak, hizmet anahtar doğrulamasını da denetleyebilir ve anahtarların cihazda nasıl depolandığı ile ilgili uygulanan sınırlamalar olup olmadığını ayırt edebilir. Örneğin, cihaz anahtarları korumak için TPM kullandığında, anahtarları TPM olmadan depoladığından daha güvenlidir. Örneğin, arka uç mantığı, TPM kullanılmadığında riskleri azaltmak için kullanıcının yalnızca belirli bir miktarda para aktarmasına izin verilmesine karar verebilir.
Kanıtlama yalnızca 2.0 veya sonraki bir sürüme sahip TPM yongası olan cihazlarda kullanılabilir. Bu nedenle, bu bilgilerin her cihazda kullanılamayabileceğini hesaba katmalısınız.
İstemci iş akışı aşağıdaki grafik gibi görünebilir:
Uygulama arka uçta hizmeti çağırdığında, sunucu bir sınama gönderir. Sınama aşağıdaki kodla imzalanır:
var openKeyResult = await KeyCredentialManager.OpenAsync(AccountId);
if (openKeyResult.Status == KeyCredentialStatus.Success)
{
var userKey = openKeyResult.Credential;
var publicKey = userKey.RetrievePublicKey();
var signResult = await userKey.RequestSignAsync(message);
if (signResult.Status == KeyCredentialStatus.Success)
{
return signResult.Result;
}
else if (signResult.Status == KeyCredentialStatus.UserPrefersPassword)
{
}
}
İlk satır olan KeyCredentialManager.OpenAsync, Windows'dan anahtar tutamacını açmasını ister. Bu başarılı olursa, Sınama iletisini KeyCredential.RequestSignAsync yöntemiyle imzalayabilirsiniz ve bu da Windows'un Windows Hello aracılığıyla kullanıcının PIN'ini veya biyometrisini istemesine neden olur. Geliştirici, kullanıcının özel anahtarına hiçbir zaman erişmeyecektir. Bunların tümü API'ler aracılığıyla güvenli tutulur.
API'ler, Windows'un sınamayı özel anahtarla imzalamasını iste. Sistem daha sonra kullanıcıdan BIR PIN kodu veya yapılandırılmış biyometrik oturum açma ister. Doğru bilgiler girildiğinde sistem, TPM yongasının şifreleme işlevlerini gerçekleştirmesini ve sınamayı imzalamasını isteyebilir. (TPM yoksa yedek yazılım çözümünü kullanabilirsiniz). İstemcinin imzalı sınamayı sunucuya geri göndermesi gerekir.
Bu sıralı diyagramda temel bir sınama-yanıt akışı gösterilir:
Ardından, sunucunun imzayı doğrulaması gerekir. Ortak anahtarı istediğinizde ve gelecekte doğrulama için kullanmak üzere sunucuya gönderdiğinizde, ASN.1 ile kodlanmış publicKeyInfo blobundadır. GitHub'da Windows Hello kod örneğini incelerseniz, ASN.1 kodlu blobu daha yaygın olarak kullanılan bir CNG blob'a çevirmek için Crypt32 işlevlerini sarmalayan yardımcı sınıflar olduğunu görürsünüz. Blob, RSA olan ortak anahtar algoritmasını ve RSA ortak anahtarını içerir.
Örnekte ASN.1 kodlu blobu bir CNG blob'una dönüştürme nedenimiz CNG ve BCrypt API'si ile kullanılabilmesini sağlamaktır. CNG blobunu incelerseniz,ilgili
CNG blobunu aldıktan sonra, imzalı sınamayı kullanıcının ortak anahtarına karşı doğrulamanız gerekir. Herkes kendi sistemini veya arka uç teknolojisini kullandığından, bu mantığı uygulamanın genel bir yolu yoktur. Karma algoritma olarak SHA256 ve SignaturePadding için Pkcs1 kullanıyoruz, bu nedenle istemciden imzalı yanıtı doğrularken bunu kullandığınızdan emin olun. .NET 4.6'da sunucunuzda bunu yapmak için örneğe tekrar bakın, ancak genel olarak şuna benzer olacaktır:
using (RSACng pubKey = new RSACng(publicKey))
{
retval = pubKey.VerifyData(originalChallenge, responseSignature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
}
RSA anahtarı olan depolanan ortak anahtarı okuduk. İmzalı sınama iletisini ortak anahtarla doğrularız ve bu durumda kullanıcıyı yetkileriz. Kullanıcının kimliği doğrulanmışsa uygulama arka uç hizmetlerini normal şekilde çağırabilir.
Kodun tamamı aşağıdakine benzer olabilir:
using System;
using System.Runtime;
using System.Threading.Tasks;
using Windows.Storage.Streams;
using Windows.Security.Cryptography;
using Windows.Security.Cryptography.Core;
using Windows.Security.Credentials;
static async Task<IBuffer> GetAuthenticationMessageAsync(IBuffer message, String AccountId)
{
var openKeyResult = await KeyCredentialManager.OpenAsync(AccountId);
if (openKeyResult.Status == KeyCredentialStatus.Success)
{
var userKey = openKeyResult.Credential;
var publicKey = userKey.RetrievePublicKey();
var signResult = await userKey.RequestSignAsync(message);
if (signResult.Status == KeyCredentialStatus.Success)
{
return signResult.Result;
}
else if (signResult.Status == KeyCredentialStatus.UserCanceled)
{
// Launch app-specific flow to handle the scenario
return null;
}
}
else if (openKeyResult.Status == KeyCredentialStatus.NotFound)
{
// PIN reset has occurred somewhere else and key is lost.
// Repeat key registration
return null;
}
else
{
// Show custom UI because unknown error has happened.
return null;
}
}
Doğru sınama-yanıt mekanizmasının uygulanması bu belgenin kapsamı dışındadır, ancak bu konu, yeniden yürütme saldırıları veya ortadaki adam saldırıları gibi şeyleri önlemek için güvenli bir mekanizmanın başarıyla oluşturulması için dikkat gerektiren bir konudur.
Başka bir cihaz kaydettirme
Kullanıcıların bugün aynı uygulamaların yüklü olduğu birden çok cihaza sahip olması yaygın bir durum. Windows Hello'yu birden çok cihazla kullanırken bu nasıl çalışır?
Windows Hello kullanırken, her cihaz benzersiz bir özel ve ortak anahtar kümesi oluşturur. Bu, bir kullanıcının birden çok cihaz kullanabilmesini istiyorsanız arka ucunuzun bu kullanıcının birden çok ortak anahtarını depolayabilmesi gerektiği anlamına gelir. Tablo yapısının bir örneği için Yeni kullanıcıları kaydetme bölümündeki veritabanı diyagramına bakın.
Başka bir cihaz kaydetmek, bir kullanıcıyı ilk kez kaydetmekle neredeyse aynıdır. Yine de bu yeni cihaza kaydolan kullanıcının gerçekten iddia ettikleri kullanıcı olduğundan emin olmanız gerekir. Bunu, bugün kullanılan iki öğeli kimlik doğrulama mekanizmalarıyla yapabilirsiniz. Bunu güvenli bir şekilde gerçekleştirmenin birkaç yolu vardır. Her şey senaryonuza bağlıdır.
Örneğin, hala oturum açma adı ve parola kullanıyorsanız, kullanıcının kimliğini doğrulamak ve sms veya e-posta gibi doğrulama yöntemlerinden birini kullanmasını istemek için bunu kullanabilirsiniz. Oturum açma adınız ve parolanız yoksa, zaten kayıtlı cihazlardan birini kullanabilir ve bu cihazdaki uygulamaya bir bildirim gönderebilirsiniz. MSA kimlik doğrulayıcı uygulaması buna bir örnektir. Kısacası, kullanıcıya ek cihazlar kaydetmek için ortak bir 2FA mekanizması kullanmanız gerekir.
Yeni cihazı kaydetme kodu, kullanıcıyı ilk kez kaydetmeyle (uygulamanın içinden) tamamen aynıdır.
var keyCreationResult = await KeyCredentialManager.RequestCreateAsync(
AccountId, KeyCredentialCreationOption.ReplaceExisting);
Kullanıcının hangi cihazların kayıtlı olduğunu tanımasını kolaylaştırmak için, kayıt kapsamında cihaz adını veya başka bir tanımlayıcıyı göndermeyi seçebilirsiniz. Bu, örneğin arka ucunuzda kullanıcıların bir cihaz kaybolduğunda cihazların kaydını kaldırabileceği bir hizmet uygulamak istiyorsanız da kullanışlıdır.
Uygulamanızda birden çok hesap kullanma
Tek bir hesap için birden çok cihazı desteklemeye ek olarak, tek bir uygulamada birden çok hesabı desteklemek de yaygın bir durumdur. Örneğin, uygulamanızın içinden birden çok Twitter hesabına bağlanıyor olabilirsiniz. Windows Hello ile birden çok anahtar çifti oluşturabilir ve uygulamanızın içinde birden çok hesabı destekleyebilirsiniz.
Bunu yapmanın bir yolu, önceki bölümde açıklanan kullanıcı adını veya benzersiz tanımlayıcıyı yalıtılmış depolamada tutmaktır. Bu nedenle, her yeni hesap oluşturduğunuzda, hesap kimliğini yalıtılmış depolama alanında depolarsınız.
Uygulama kullanıcı arabiriminde, kullanıcının önceden oluşturulmuş hesaplardan birini seçmesine veya yeni bir hesap ile kaydolmasına izin verirsiniz. Yeni hesap oluşturma akışı, daha önce açıklananla aynıdır. Hesap seçmek, depolanan hesapları ekranda listelemekle ilgilidir. Kullanıcı bir hesap seçtikten sonra hesap kimliğini kullanarak uygulamanızda oturum açın:
var openKeyResult = await KeyCredentialManager.OpenAsync(AccountId);
Akışın geri kalanı daha önce açıklananla aynıdır. Bu senaryoda aynı Windows Hesabı ile tek bir cihazda kullanıldığından, tüm bu hesaplar aynı PIN veya biyometrik hareketle korunur.
Mevcut Bir Sistemi Windows Hello'ya Geçirme
Bu kısa bölümde, kullanıcı adı ve karma parolayı depolayan bir veritabanı kullanan mevcut paketlenmiş bir uygulama ve arka uç sistemine değineceğiz. Bu uygulamalar, uygulama başlatıldığında kullanıcıdan kimlik bilgilerini toplar ve arka uç sistemi kimlik doğrulama sınamasını döndürdüğünde bunları kullanır.
Burada, Windows Hello'yu çalışır hale getirmek için hangi parçaların değiştirilmesi veya değiştirilmesi gerektiğini açıklayacağız.
Önceki bölümlerde tekniklerin çoğunu zaten açıklamış olduk. Mevcut sisteminize Windows Hello eklemek, kodunuzun kayıt ve kimlik doğrulaması bölümüne birkaç farklı akış eklemeyi içerir.
Bir yaklaşım, kullanıcının ne zaman yükseltileceğini seçmesine izin vermektir. Kullanıcı uygulamada oturum açtığında ve uygulamanın ve işletim sisteminin Windows Hello'yu destekleyemediğini algıladıktan sonra, kullanıcıya bu modern ve daha güvenli sistemi kullanmak için kimlik bilgilerini yükseltmek isteyip istemediğini sorabilirsiniz. Kullanıcının Windows Hello kullanıp kullanamayacağını denetlemek için aşağıdaki kodu kullanabilirsiniz.
var keyCredentialAvailable = await KeyCredentialManager.IsSupportedAsync();
Kullanıcı arabirimi şuna benzer olabilir:
Kullanıcı Windows Hello'yu kullanmaya başlamayı seçerse, daha önce açıklanan KeyCredential'ı oluşturursunuz. Arka uç kayıt sunucusu, ortak anahtarı ve isteğe bağlı kanıtlama deyimini veritabanına ekler. Kullanıcının kimliği kullanıcı adı ve parolayla zaten doğrulandığından, sunucu yeni kimlik bilgilerini veritabanındaki geçerli kullanıcı bilgilerine bağlayabilir. Veritabanı modeli, daha önce açıklanan örnekle aynı olabilir.
Uygulama KeyCredential kullanıcılarını oluşturabildiyse, kullanıcı kimliğini yalıtılmış depolamada depolar, böylece uygulama yeniden başlatıldıktan sonra kullanıcı listeden bu hesabı seçebilir. Bu noktadan itibaren akış, önceki bölümlerde açıklanan örnekleri tam olarak izler.
Tam bir Windows Hello senaryosuna geçiş işleminin son adımı, uygulamada oturum açma adı ve parola seçeneğini devre dışı bırakmak ve depolanan karma parolaları veritabanınızdan kaldırmaktır.
Özet
Windows, uygulamaya koymak da kolay olan daha yüksek bir güvenlik düzeyi sağlar. Windows Hello, kullanıcıyı tanıyan ve düzgün tanımlamayı aşma çabalarını etkin bir şekilde yenen yeni bir biyometrik oturum açma sistemi sağlar. Daha sonra, güvenilir platform modülünün dışında asla ortaya çıkarılamayacak veya kullanılamayabilecek birden çok anahtar ve sertifika katmanı sunabilir. Ayrıca, isteğe bağlı kanıtlama kimlik anahtarları ve sertifikaları kullanarak daha fazla güvenlik katmanı sağlanır.
Geliştirici olarak, uygulamaları ve arka uç hizmetlerini korumak amacıyla paketlenmiş Windows uygulama dağıtımlarınıza kolayca güvenli kimlik doğrulaması eklemek için bu teknolojilerin tasarımı ve dağıtımıyla ilgili bu kılavuzu kullanabilirsiniz. Gereken kod çok azdır ve anlaşılması kolaydır. Ağır kaldırmayı Windows halleder.
Esnek uygulama seçenekleri, Windows Hello'nın mevcut kimlik doğrulama sisteminizi değiştirmesine veya bu sistemle birlikte çalışmasına olanak sağlar. Dağıtım deneyimi sorunsuz ve ekonomiktir. Windows güvenliğini dağıtmak için ek altyapı gerekmez. İşletim sisteminde yerleşik olarak bulunan Microsoft Hello ile Windows, modern geliştiricinin karşılaştığı kimlik doğrulama sorunlarına en güvenli çözümü sunar.
Görev tamamlandı! İnternet'i daha güvenli bir yer haline getirdiniz!
Ek kaynaklar
Makaleler ve örnek kod
- Windows Hello'ya genel bakış
- İş İçin Windows Hello dağıtımı planlama
- GitHub'da Windows Hello UWP kod örneği
Terminoloji
| Süre | Tanım |
|---|---|
| AIK | Bir kanıtlama kimlik anahtarı, geçirilemez anahtarın özelliklerini imzalayarak ve doğrulama için bağlı olan tarafa özellikleri ve imzayı sağlayarak bu tür bir şifreleme kanıtı (TPM anahtarı kanıtlama) sağlamak için kullanılır. Sonuçta elde edilen imzaya "kanıtlama deyimi" adı verilir. İmza, yalnızca onu oluşturan TPM'de kullanılabilen AIK özel anahtarı kullanılarak oluşturulduğundan, bağlı olan taraf, doğrulanan anahtarın gerçekten geçirilemez olduğuna ve bu TPM dışında kullanılamayabileceğine güvenebilir. |
| AIK Sertifikası | AIK sertifikası, TPM içinde bir AIK'nin varlığını doğrulamak için kullanılır. Ayrıca, AIK tarafından onaylanan diğer anahtarların söz konusu TPM'den geldiğini de kanıtlama amacıyla kullanılır. |
| IDP | IDP bir kimlik sağlayıcısıdır. Microsoft Hesapları için Microsoft tarafından yapılan IDP derlemesi örnek olarak verilmiştir. Bir uygulamanın MSA ile kimlik doğrulaması yapması gerektiğinde MSA IDP'sini çağırabilir. |
| PKI | Ortak anahtar altyapısı genellikle kuruluşun kendisi tarafından barındırılan bir ortama işaret etmek ve anahtar oluşturmak, anahtarları iptal etmek vb. sorumlu olmak için kullanılır. |
| TPM | Güvenilir Platform Modülü (TPM), özel anahtarın TPM dışında hiçbir zaman açığa çıkarılamayacağı veya kullanılamayacağı şekilde, şifreleme ortak/özel anahtar çiftleri oluşturmak için kullanılabilir (yani anahtar geçirilemez). |
| TPM Anahtar Kanıtlama | Bir anahtarın TPM'ye bağlı olduğunu kriptografik olarak kanıtlayan bir protokol. Bu tür bir kanıtlama, belirli bir bilgisayarın TPM'sinde belirli bir şifreleme işleminin gerçekleştiğini garanti etmek için kullanılabilir |
İlgili konular
Windows developer