Microsoft SDL Şifreleme Öneriler
Giriş
Bu belge, Microsoft platformlarında şifrelemeyi kullanmaya yönelik önerileri ve en iyi yöntemleri içerir. Buradaki içeriğin büyük bir alanı, Güvenlik Geliştirme Yaşam Döngüsü oluşturmak için kullanılan Microsoft'un kendi iç güvenlik standartlarıyla uyumlu veya toplanmış. Microsoft'un kendi ürün ve hizmetlerini gerektirdiği API'leri, algoritmaları, protokolleri ve anahtar uzunluklarını kullanmak üzere ürün tasarlarken başvuru olarak kullanılmalıdır.
Platformlar üzerinde Windows geliştiriciler de bu önerilerden yararlanabilir. API ve kitaplık adları farklı olabilir ama algoritma seçimi içeren en iyi yöntemler, anahtar uzunluğu ve veri koruması platformlar arasında benzerdir.
Güvenlik Protokolü, Algoritma ve Anahtar Uzunluğu Öneriler
SSL/TLS sürümleri
Ürünler ve hizmetler SSL/TLS'nin şifreleme güvenliği sürümlerini kullanmalısınız:
TLS 1.2 etkinleştirilmelidir
Yalnızca geriye dönük uyumluluk için TLS 1.1 ve TLS 1.0 etkinleştirilmelidir
SSL 3 ve SSL 2 varsayılan olarak devre dışı bırak bırakılabilir
Simetrik Blok Şifreleme, Şifreleme Modları ve Başlatma Vektörleri
Şifrelemeleri Engelle
Simetrik blok şifrelemesi kullanan ürünler için:
Gelişmiş Şifreleme Standardı (AES), yeni kod için önerilir.
Üç Anahtarlı Üçlü Veri Şifreleme Standardı (3DES), geriye dönük uyumluluk için var olan kodda izin verilen bir koddur.
RC2, DES, 2-Key 3DES, DESX ve Skippher gibi diğer tüm şifreleme şifrelemeleri, yalnızca eski verilerin şifresini çözmek için kullanılmalıdır ve şifreleme için kullanılırsa değiştir kullanılmalıdır.
Simetrik blok şifreleme algoritmaları için en az 128 bit anahtar uzunluğu önerilir. Yeni kod için önerilen tek blok şifreleme algoritması AES'tir (AES-128, AES-192 ve AES-256'nın hepsi kabul edilebilir durumdadır; AES-192 bazı işlemcilerde iyileştirme olmamasına neden olur). Üç anahtarlı 3DES şu anda var olan kodda zaten kullanıyorsa kabul edilebilir; AES'ye geçiş önerilir. DES, DESX, RC2 ve Skip skip ayrıca güvenli kabul edilir. Bu algoritmalar geriye dönük uyumluluk açısından yalnızca mevcut verilerin şifresini çözmek için kullanılmalıdır ve veriler önerilen şifreleme kullanılarak yeniden şifrelenir.
Şifreleme Modları
Simetrik algoritmalar, çoğu düz metin ve şifreleme bloklarında şifreleme işlemlerini birlikte bağlayarak çeşitli modlarda çalışır.
Simetrik blok şifreleme, aşağıdaki şifreleme modlarından biri ile kullanılmalıdır:
Şifreleme Blok Zinciri (CBC)
Şifreleme metni çalmak (CTS)
Şifreleme Metni Çalmak Tweaked-Codebook XEX Tabanlı Metin (XTS)
Aşağıdakiler gibi diğer şifreleme modları, bunların yanlış kullanılma olasılığı daha yüksek olan uygulama hatalarına sahiptir. Özellikle, Elektronik Kod Defteri (ECB) modundan kaçınılmalıdır. CTR gibi "şifreleme modları" içinde blok şifrelemeleri ile aynı başlatma vektörü (IV) yeniden kullanılırken, şifrelenmiş verilerin ortaya çıkarılamalarına neden olabilir. Aşağıdaki modlardan herhangi biri kullanılıyorsa, ek güvenlik incelemesi önerilir:
Çıkış Geri Bildirimi (OFB)
Şifreleme Geri Bildirimi (CFB)
Counter (CTR)
CBC-MAC (CCM) ile Counter
Gal biraya/Counter Mode (GCM)
Yukarıdaki "önerilenler" listesinde yer alan başka hiçbir şey
Başlatma Vektörleri (IV)
Tüm simetrik blok şifrelemeler şifrelemede bir başlatma vektörü olarak şifreleme açısından güçlü rastgele sayı ile kullanılmalıdır. Başlatma vektörleri hiçbir zaman sabit bir değer olmalı. Şifrelemesel olarak güçlü rastgele sayılar oluşturma önerileri için Rastgele Sayı Oluşturucular'a bakın.
Birden çok şifreleme işlemi yaparken başlatma vektörleri hiçbir zaman yeniden kullanılmamalıdır, çünkü bu durum özellikle Çıktı Geri Bildirimi (OFB) veya Counter (CTR) gibi akış şifreleme modlarını kullanırken şifrelenmiş veriler hakkında bilgi açığa çıkarabilir.
Asimetrik Algoritmalar, Anahtar Uzunlukları ve Doldurma Modları
RSA
RSA şifreleme, anahtar değişimi ve imzalar için kullanılmalıdır.
RSA şifrelemesi OAEP veya RSA-PSS doldurma modlarını kullansın. Var olan kodda yalnızca uyumluluk için PKCS #1 v1.5 doldurma modu kullanılabilir.
Boş doldurma kullanımı önerilmez.
Tuşlar > = 2048 bit önerilir
ECDSA
>= 256 bit tuşlarıyla ECDSA kullanılması önerilir
ECDSA tabanlı imzalar, NIST onaylı üç eğriden (P-256, P-384 veya P521) birini kullanlardır.
ECDH
= 256 bit tuşları ile ECDH > önerilir
ECDH tabanlı anahtar değişimi, NIST onaylı üç eğriden (P-256, P-384 veya P521) birini kullanamalı.
Integer diffie-Dizeman
Anahtar uzunluğu > = 2048 bit önerilir
Grup parametreleri iyi bilinen bir grup (örn. RFC 7919) veya güvenilir bir taraf tarafından oluşturulmuş ve kullanımdan önce kimliği doğrulanmış bir grup olmalıdır
Anahtar Yaşam Ömrü
Tüm asimetrik anahtarların en çok beş yıllık yaşam süresi olmalı ve bir yıl boyunca önerilir.
Tüm simetrik tuşların yaşam süresi en fazla üç olmalı; önerilen bir yıllık yaşam süresi.
Sınırlı etkin yaşam süresine ulaşmak için tuşları değiştirmek için bir mekanizma sağlalı veya bir sürecin olması gerekir. Etkin yaşam süresi sona erdikten sonra, yeni veriler (örneğin şifreleme veya imzalama) üretmek için anahtar kullanılmalı, ancak verileri okumak için kullanılabilir (örneğin, şifre çözme veya doğrulama için).
Rastgele Sayı Oluşturucular
Tüm ürün ve hizmetler, rastgelelik gerektiğinde şifreleme ile rastgele sayı oluşturucuları kullanmalı.
CNG
- En önemli bayrağıyla BCryptGenRandom BCRYPT_USE_SYSTEM_PREFERRED_RNG kullanma
CAPI
- Rastgele değerler oluşturmak için CryptGenRandom kullanın.
Win32/64
Eski kod RtlGenRandom'ı çekirdek modunda kullanabilir
Yeni kod, BCryptGenRandom veya CryptGenRandom kullan açıklamalı.
C işlevi Rand_s() de önerilir (bu işlev Windows, CryptGenRandom)
Rand_s(), Rand() işlevinin yerine geçen güvenli ve iyi performans alan bir sistemdir. Rand() hiçbir şifreleme uygulaması için kullanılmamalı, ancak yalnızca dahili test için uygundur.
SystemPrng işlevi çekirdek modu kodu için önerilir.
.NET
Windows Store Uygulamaları
- Store Uygulamaları CryptographicBuffer.GenerateRandom veya CryptographicBuffer.GenerateRandomNumber kullanabilir.
Önerilmez
Rastgele sayı üretimiyle ilgili insecure işlevleri arasında rand,System.Random (.NET), GetTickCount ve GetTickCount64 vardır.
Çift üç noktalı eğri rastgele sayı oluşturucu ("DUAL_EC_DRBG") algoritmasının kullanılması önerilmez.
Windows Desteklenen Şifreleme Kitaplıkları
Uygulama Windows, Microsoft işletim sisteminde yerleşik olan şifreleme API'lerini kullanmayı önermektedir. Diğer platformlarda, geliştiriciler platform olmayan şifreleme kitaplıklarını kullanım için değerlendirmeyi seçebilir. Genel olarak, platform şifreleme kitaplıkları bir uygulama ile paketlenme yerine işletim sisteminin bir parçası olarak sevk edildiklerinden daha sık güncelleştirilir.
Platform ve platform dışı şifrelemeyle ilgili her türlü kullanım kararı aşağıdaki gerekliliklere uygun olarak rehber olunacaktır:
Kitaplık, bilinen güvenlik açıkları için geçerli bir destek sürümüne sahip değil
En son güvenlik protokolleri, algoritmalar ve anahtar uzunlukları destek olmalıdır
(İsteğe bağlı) Kitaplık yalnızca geriye dönük uyumluluk için eski güvenlik protokollerini/algoritmaları destekleyene sahip olmalı
Yerel Kod
Şifreleme Temelleri: Sürüm Windows başka bir Windows Phone, mümkünse CNG kullanın. Aksi takdirde, uzak Vista'dan ileriye doğru IRZ üzerinde eski bir bileşen olarak desteklenen CryptoAPI'yı (CAPI Windows da Windows) kullanın.
SSL/TLS/DTLS: WinINet,WinHTTP,Schannel,IXMLHTTPRequest2veyaIXMLHTTPRequest3.
- TLS 1.2'yi desteklemek için WinHTTP uygulamaları WinhttpSetOptionile yerleşik olarak gerekir
Kod imzası doğrulaması: WinVerifyTrust, platformlarda kod imzalarını doğrulamak için desteklenen WINDOWS API'dir.
Sertifika Doğrulaması (kod imzalama veya SSL/TLS/DTLS için kısıtlanmış sertifika doğrulamasında kullanılan): CAPI2 API; örneğin, CertGetCertificateChain ve CertVerifyCertificateChainPolicy
Yönetilen Kod
Şifreleme Temelleri: System.Security.Cryptography ad uzayı'da tanımlanan API'yi kullanın--- CNG sınıfları tercih edilir.
Kullanılabilir .Net Framework'in en son sürümünü kullanın. En azından .Net Framework sürüm 4.6'dır. Daha eski bir sürüm gerekli ise söz konusu uygulama için TLS 1.2'yi etkinleştirmek için "SchUseStrongCrypto" regkey'in ayarlanmış olduğundan emin olun.
Sertifika Doğrulaması: System.Security.Cryptography.X509Certificates ad alanı altında tanımlanan API'leri kullanın.
SSL/TLS/DTLS: Api'leri System.Net alanı altında tanımlanan API'leri kullanın (örneğin, HttpWebRequest).
Anahtar Türetme İşlevleri
Anahtar türetme, paylaşılan bir gizliden veya mevcut bir şifreleme anahtarından şifreleme anahtarı malzemesi türetme işlemidir. Ürünlerde önerilen anahtar türetme işlevleri kullanılır. Bu kılavuzda, kullanıcı tarafından seçilen parolalardan türeyen anahtarlar veya kimlik doğrulama sisteminde depolama için karma parolalar kullanma, özel bir durum değildir; geliştiricilerin bir uzmana danışması gerekir.
Aşağıdaki standartlarda, kullanım için önerilen KDF işlevleri belirtmektedir:
NIST SP 800-108: Takma Ad İşlevlerini kullanarak anahtarTüretme için öneri. Özel olarak, ters modda KDF ve HMAC sahte işlev olarak HMAC
NIST SP 800-56A (Düzeltme 2): Ayrık Logarithm Şifrelemesi kullanılarak Pair-WiseTemel Referans Düzenleri Hakkında Öneri . Özellikle Bölüm 5.8.1'in "Tek Adımlı Anahtar Türetme İşlevi" önerilir.
Var olan tuşlardan anahtarları türetmek için, algoritmalardan birini kullanarak BCryptKeyDerivation API'sini kullanın:
BCRYPT_SP800108_CTR_HMAC_ALGORITHM
BCRYPT_SP80056A_CONCAT_ALGORITHM
Anahtarları paylaşılan bir gizliden (anahtar sözleşmesi çıktısı) türetir için BCryptDeriveKey API'sini aşağıdaki algoritmalardan birini kullanarak kullanın:
BCRYPT_KDF_SP80056A_CONCAT
BCRYPT_KDF_HMAC
Sertifika Doğrulama
SSL, TLS veya DTLS kullanan ürünler, bağlanacakları varlıkların X.509 sertifikalarını tam olarak doğrulamalısınız. Sertifikalar için doğrulama da buna dahildir:
Etki alanı adı.
Geçerlilik tarihleri (hem başlangıç hem de son kullanma tarihleri).
İptal durumu.
Kullanım (örneğin, sunucular için "Sunucu Kimlik Doğrulaması", istemciler için "İstemci Kimlik Doğrulaması" gibi).
Güven zinciri. Sertifikalar, platform tarafından güvenilen veya yönetici tarafından açıkça yapılandırılmış bir kök sertifika yetkilisine (CA) sahip olması gerekir.
Bu doğrulama testlerinin herhangi biri başarısız olursa, ürün varlıkla bağlantıyı sonlandırmalı.
"Otomatik olarak imzalanan" sertifikalara güvenen istemciler (örneğin, varsayılan yapılandırmada bir Exchange sunucusuna bağlanan posta istemcisi) sertifika doğrulama denetimlerini yoksayabilirsiniz. Bununla birlikte, otomatik olarak imzalanan sertifikalar güveni, destek iptali veya anahtar yenilemeyi desteklemez. Otomatik olarak imzalanan sertifikalara, bunları başka bir güvenilir kaynaktan aldıysanız (örneğin, kimliği doğrulanmış ve bütünlük korumalı bir aktarım üzerinden sertifika sağlayan güvenilir varlık) güvenebilirsiniz.
Şifreleme Karma İşlevleri
Ürünler SHA-2 karma algoritmalarını (SHA256, SHA384 ve SHA512) kullanmaktadır. Güvenlik amacıyla 128 bit'den az şifreleme karmaları kullanılması önerilmez.
MAC/HMAC/anahtarlı karma algoritmaları
İleti kimlik doğrulama kodu (MAC), iletinin alıcısına hem gönderenin kimlik doğrulamasını hem de gizli bir anahtar kullanarak iletinin bütünlüğünü doğrulamasını sağlayan bir bilgi parçasıdır.
Karma tabanlı MAC(HMAC) veya blok şifreleme tabanlı MAC'in kullanımı, tüm temel karma veya simetrik şifreleme algoritmalarının da kullanılması önerilir; Şu anda bu işlevler HMAC-SHA2 işlevlerini (HMAC-SHA256, HMAC-SHA384 ve HMAC-SHA512) içerir.
HMA'ların 128 bit'den küçük olacak şekilde kırp kullanılması önerilmez.
Tasarım ve İşlemde Dikkate Alınacak Noktalar
Şifreleme anahtarlarını gerektiği gibi değiştirmek için bir mekanizma sağlanız gerekir. Etkin yaşam sürelerinin sonuna ulaştıktan sonra veya şifreleme anahtarının güvenliği ihlal edildiyse, anahtarların değiştirilmesi gerekir. Bir sertifikayı her yenilerken, bunu yeni bir anahtarla yenilemelisiniz.
Verileri korumak için şifreleme algoritmaları kullanan ürünler, gelecekte farklı algoritmalara ve bu içerikler için yeterli meta veri içermeli. Kullanılan algoritma, anahtar boyutları, başlatma vektörleri ve doldurma modları buna dahildir.
- Cryptographic Agility hakkında daha fazla bilgi için bkz. MSDN'de Cryptographic Agility.
Kullanılabilir olduğu zaman, ürünler yeniden uygulamak yerine, platform tarafından sağlanan şifreli protokolleri kullansın. Bu, imzalama biçimlerini de içerir (örneğin, standart, var olan bir biçim kullanın).
RC4 gibi simetrik akış şifrelemeleri kullanılma kullanılmalıdır. Simetrik akış şifrelemeleri yerine, ürünler en az 128 bit anahtar uzunluğuna sahip, özellikle de AES olmak üzere bir blok şifreleme kullanmalı.
Şifreleme işlemi hatalarını son kullanıcılara bildirme. Uzak arayanlara (web istemcisi veya istemci sunucu senaryosunda istemci gibi) bir hata döndürürken, yalnızca genel bir hata iletisi kullanın.
- Aralığın dışında veya geçersiz uzunluk hatalarını doğrudan raporlama gibi gereksiz bilgiler sağlamaktan kaçının. Yalnızca sunucuda ayrıntılı hataları ve yalnızca ayrıntılı günlüğe kaydetme etkinleştirildiğinde günlüğe kaydetme.
Aşağıdakileri içeren tüm tasarımlarda ek güvenlik incelemesi önerilir:
Öncelikli olarak güvenlik üzerine odaklanan yeni protokol (kimlik doğrulama veya yetkilendirme protokolü gibi)
Yeni veya standart olmayan bir şekilde şifreleme kullanan yeni protokol o Örnek'te dikkate alınacak noktalar şunlardır:
Protokolü uygulayan bir ürün, protokol uygulamanın bir parçası olarak tüm şifreleme API'lerini veya yöntemleri çağıracak mı?
Protokol, kimlik doğrulama veya yetkilendirme için kullanılan diğer protokollere bağlı mı?
Protokol, anahtarlar gibi şifreleme öğeleri için depolama biçimlerini tanımlar mı?
Üretim ortamlarında otomatik olarak imzalanan sertifikalar önerilmez. Ham şifreleme anahtarının kullanımı gibi otomatik olarak imzalanan bir sertifikanın kullanımı yapısal olarak kullanıcılara veya yöneticilere güven kararı vermenin temellerini sağlamaz.
- Buna karşılık, güvenilir bir sertifika yetkilisine kök sertifika kullanımı, ilişkili özel anahtara güvenmek için temel sağlar ve güvenlik hatası durumunda iptal ve güncelleştirmeleri sağlar.
Hassas Verileri Şifrele Depolama
DPAPI/DPAPI-NG
Sistem yeniden başlatmaları sırasında kalıcı olması gereken veriler için:
CryptProtectData
CryptUnprotectData
NCryptProtectSecret (Windows 8 CNG DPAPI)
Sistem yeniden başlatmaları sırasında kalıcı olması gerek zorunda olmadığınız veriler için:
CryptProtectMemory
CryptUnprotectMemory
Birden çok etki alanı hesabı ve bilgisayar tarafından kalıcı ve erişilebilir olması gereken veriler için:
NCryptProtectSecret (CNG DPAPI'da, şu anda Windows 8)
SQL Server TDE
Hassas verileri korumak SQL Server Saydam Veri Şifrelemesi TDE) kullanabilirsiniz.
SDL şifreleme algoritması ve temel güvenlik gereksinimlerine uygun bir TDE veritabanı şifreleme anahtarı (DEK) kullan gerekir. Şu anda yalnızca AES_128, AES_192 ve AES_256 bilgi önerilir; TRIPLE_DES_3KEY önerilmez.
TDE'nin kullanımıyla ilgili dikkate SQL dikkate alınması gereken bazı önemli noktalar vardır:
SQL Server, TDE etkin olsa bile FILESTREAM verileri için şifrelemeyi desteklemez.
TDE, veritabanına veya veritabanından aktarma sırasındaki veriler için otomatik olarak şifreleme sağlamaz; ayrıca, bu veritabanına şifreli bağlantıları SQL Server gerekir. Şifreli bağlantıları etkinleştirme hakkında yol gösterici bilgi için lütfen Veritabanı Altyapısına (SQL Server Yapılandırma Yöneticisi) Şifreli Bağlantıları Etkinleştirme'ye bakın.
TDE korumalı bir veritabanını başka bir SQL Server örneğine taşısanız, TDE Veri Şifreleme Anahtarı'nın (DEK) korumasını koruyan sertifikayı da taşımalı ve hedef veritabanına (örneğinin ana veritabanına) SQL Server gerekir. Daha fazla bilgi için TDE Korumalı Veritabanını Başka Bir Veritabanına Taşıma SQL Server TechNet makalesine bakın.
Kimlik Bilgileri Yönetimi
Parolayı ve kimlik Windows korumak için Ana Windows Yöneticisi API'sini veya Microsoft Azure KeyVault'un bilgilerini kullanın.
Windows Store Uygulamaları
Sınıftaki sınıfları Windows. Security.Cryptography ve Windows. Gizli bilgileri ve hassas verileri korumak için Security.Cryptography.DataProtection ad alanları.
ProtectAsync
ProtectStreamAsync
UnprotectAsync
UnprotectStreamAsync
Sınıftaki sınıfları Windows. Parolayı ve kimlik bilgileri verilerini korumak için Security.Credentials ad alanı.
.NET
Sistem yeniden başlatmaları sırasında kalıcı olması gereken veriler için:
ProtectedData.Protect
ProtectedData.Unprotect
Sistem yeniden başlatmaları sırasında kalıcı olması gerek zorunda olmadığınız veriler için:
ProtectedMemory.Protect
ProtectedMemory.Unprotect
Yapılandırma dosyaları için
Sırasıyla RSAProtectedConfigurationProvider veya DPAPIProtectedConfigurationProvider kullanarak yapılandırmanızı korumak için RSAProtectedConfigurationProvider.
RSAProtectedConfigurationProvider, küme içinde birden çok makinede kullanılabilir. Daha fazla bilgi için bkz. Korumalı Yapılandırmayı Kullanarak Yapılandırma Bilgilerini Şifreleme.