Modelim, diğer istemcilerden bazılarıyla (hepsi değil) konuşmak isteyen birkaç müşterimin olduğu modeldir.
Tüm mesajlar bir sunucu üzerinden gönderilecektir.
Sadece birbirleriyle iletişim kuran iki müşteri mesajı bilebilir. Bu yüzden sunucu VE diğer istemciler hangi iletinin gönderildiğini çözememelidir.
İki istemci arasındaki iletişim günde birkaç kez başlayıp bitebilir.
İletiler, potansiyel olarak sınırsız uzunlukta düz metin olacaktır, ancak çok daha az olması muhtemeldir, SMS stil iletileri) düşünün.
Bu koşullar göz önüne alındığında, mesajları nasıl şifrelemeliyim? Daha iyi hız veya verimlilik sağlarsa ekstra kod yazmayı umursamıyorum.
RSA ve AES'in nasıl çalıştığının temel temellerini biliyorum ama en iyi olanı bulamıyorum.
RSA için genel/özel bir anahtar çifti oluşturduğunuzda, yeni bir çift oluşturmanız gereken herhangi bir durum var mı? Veya bir müşterinin bir ortak anahtarı olabilir ve onunla konuşmak isteyen herkese aynı anahtarı verebilir mi ve yalnızca mesajları okuyabilir (ancak), ancak gelecekteki tüm mesajlar için ortak anahtarı saklayabilirler mi?
Ya da müşteri çifti için ayrı bir simetrik AES anahtarım olmalı ve kişi ilk başlatıldığında bunu paylaşmalı ve sonsuza kadar kullanmalıyım. Yine, bunun tekrar oluşturulması gereken herhangi bir durum var mı?
İstemcinin çökmesi/kapanması/yeniden başlatılması durumunda anahtarları nasıl saklarım?
İkisi birden olmadıkça. Yanlış soru soruyorsun . Bu aşamada bir şifreleme algoritması hakkında değil, bir şifreleme protokolü hakkında düşünmelisiniz.
Kriptografik protokollerin tasarımı zordur ve sık sık güvenlik hataları kaynağıdır. Açık anahtarlı şifrelemeyi tam olarak anlamıyorsunuz, bu yüzden kendi şifreleme protokolünüzde kullanmaya hazır değilsiniz.
Yüksek düzeyde, modeliniz ortak anahtar şifrelemesine uygundur (örn. RSA). Her müşterinin kendi özel anahtarı olsun ve genel anahtarını diğer istemcide yayınlasın. İstemcinin güvenliği ihlal edilmedikçe, istemcinin özel anahtarı zaman içinde değişmez. Simetrik kriptografi (örneğin AES) burada iyi ölçeklenmez çünkü her bir müşteri çiftinin kendi gizli anahtarına sahip olması gerekir.
Mümkün olduğunca mevcut yazılımı kullanın. Kriptografik protokolleri uygulamak neredeyse onları tasarlamak kadar zordur. Müşterilerin ara sıra birbirlerine e-posta tarzı mesaj gönderdiği bir model için, iyi çalışan bir araç GnuPG şeklindedir. (Çift yönlü iletişim için SSL/TLS kullanın.)
Yani: günlük işlem için, bir mesaj göndermek için
gpg numaralı telefonu arayın, alıcının genel anahtarıyla şifreleyin ve siz gönderirken özel anahtarla oturum açın. Bir mesaj alırken, söz konusu gönderenin ortak anahtarının imzasını kontrol edin ve alıcının özel anahtarıyla şifresini çözün. Başka bir deyişle,
gpg --sign --encrypt -r NAME_OF_RECIPIENT İle gönderin ve
gpg --verify Ve ardından
gpg --decrypt İle alın.
Geriye kalan problem anahtar dağıtımdır. Bir istemci anahtar çiftini oluşturduktan sonra, diğer istemcileri bu konuda bilgilendirmeli ve genel anahtarın bir saldırgan tarafından geçişte ele geçirilmesine ve değiştirilmesine izin vermeden dağıtmalıdır. Bunun nasıl yapılacağı kesin senaryolarınızın çoğuna bağlıdır. Bu parçanın güvenliğini ihmal etmeyin.
Yalnızca GnuPG'yi çağırmanın çok yavaş olduğu ortaya çıkarsa, benzer bir protokolün daha hafif, belki de ev yapımı bir uygulamasını kullanmayı düşünün (e-posta aralığından genel gider SMS Başlık altında, GnuPG her mesaj için simetrik bir anahtar oluşturur, çünkü ortak anahtar şifrelemesi büyük mesajlar için pahalıdır; ortak anahtar algoritması sadece simetrik anahtarı şifrelemek ve dosyanın özetini imzalamak için kullanılır. Simetrik şifreleme için AES, özet algoritması olarak SHA-256 ve ortak anahtar algoritması olarak RSA kullanımı iyi bir seçimdir.
In silico tarafından zaten söylendiği gibi, RSA ve AES iki farklı amaca hizmet eder. AES, tüm bir konuşmayı şifrelemek için uygun olan hızlı bir algoritmadır. Ama bir problemi var: diğer taraflar bilmeden iki taraf arasında hangi anahtarın kullanılacağına nasıl karar verilir?
RSA bunun çözümü olabilir. Her katılımcının diğer tüm katılımcıların ortak RSA anahtarı varsa, herkes başka biriyle şifreli bir iletişim başlatabilir (diğer katılımcının ortak anahtarını kullanarak) ve kullanmak için gizli bir AES anahtarına karar verebilir. AES anahtarına karar verildikten sonra, konuşmanın geri kalanı AES kullanılarak şifrelenebilir. B katılımcısına, onunla ilgilenmek isteyen gerçekten A olduğunu kanıtlamak için dijital imza kullanılabilir.
Açıkladığım şey, grosso modo, bir tarayıcı SSL etkin bir web sunucusuna bağlandığında SSL anlaşmasının ne yaptığıdır.
Bunu yanlış anlamayın ama ...
RSA ve AES'in nasıl çalıştığının temel temellerini biliyorum ama en iyi olanı bulamıyorum.
Yalnızca temel bilgileri biliyorsanız, bu sorunu çözen doğru kişi olamayabilirsiniz (henüz). Güvenlik, çok özel ve dikkatli olmanız gereken alanlardan biridir, aksi takdirde tüm güvenlik kurulumunuzu geçersiz kılarsınız.
Ayrıca, size doğru bir cevap vermek için yeterli bilgiye sahip olduğumuza inanmıyorum. Güvenlik beklentilerine ilişkin iş sözleşmelerinin önceden bilinmesi gerekecektir.
Çoğu durumda anahtarlar, güvenlik nedeniyle üretildikleri makineyi asla terk etmez, bu nedenle bilgileri "paylaşmak" istiyorsanız, genel anahtar çözümü genellikle tamamen güvenlik açısından doğru seçimdir. Bunun istisnası, simetrik bir anahtarı, anahtarı fiziksel bir medyada kişiye göndermek gibi güvenli bir şekilde paylaşabilmenizdir.
Temel olarak, ortak anahtar şifrelemesinin (RSA gibi) kullanımı, simetrik anahtar şifrelemesinin (AES gibi) kullanımından çok daha pahalıdır ve birinden diğerine geçen birçok mesaj olduğunda, simetrik kullanmak daha iyidir tuşuna basın.
Şimdi, simetrik anahtarın oluşturulması ve değiştirilmesi genel anahtar şifrelemesi kullanılarak yapılabilir.
Örneğin:
Her istemcinin özel-ortak anahtar çifti vardır ve ortak anahtar sunucuda depolanır. İki istemci iletişim oturumunu başlattığında, her biri diğerinin ortak anahtarını sunucudan alır ve diğerine şifreli bir numara gönderir. Daha sonra her iki taraf da bu iki sayıyı toplar ve sonucu bundan sonra verileri şifrelemek/şifresini çözmek için anahtar olarak kullanır.
PUBLIC/PRIVATE stilini (yeterli bitlere sahip RSA :) kullanıyorsanız, bu şekilde tarif ettiğiniz güvenli iletişim türünü ayarlayabilirsiniz:
Sonra:
Not:
Her iki özelliği de AES ile elde etmek biraz daha zordur.