Bu makalede, Gelişmiş Şifreleme Standardı (AES), yaygın blok modları, neden doldurma ve başlatma vektörlerine ihtiyacınız olduğunu ve verilerinizi değişikliğe karşı nasıl koruyacağınızı anlatacağım. Son olarak, çoğu güvenlik sorunundan kaçınarak bunu Java ile nasıl kolayca uygulayacağınızı göstereceğim.
Orijinal adıyla Rijndael olarak da bilinen AES, NIST tarafından 2000 yılında tarihli Veri Şifreleme Standardı (DES) için bir halef bulmak üzere seçildi . AES bir blok şifresidir, yani şifreleme sabit uzunluktaki bit gruplarında gerçekleşir. Bizim durumumuzda algoritma 128 bitlik blokları tanımlar. AES, 128, 192 ve 256 bit anahtar uzunluklarını destekler.
Her blok birçok dönüşüm turundan geçer. Burada algoritmanın ayrıntılarını atlayacağım, ancak ilgilenen okuyucu AES ile ilgili Wikipedia makalesine başvuruyor . Önemli olan, anahtar uzunluğunun blok boyutunu etkilememesi, ancak dönüşüm turlarının tekrar sayısıdır (128 bit anahtar 10 döngü, 256 bit 14'tür)
Yani AES yalnızca 128 bitlik veriyi şifreleyecektir, ancak tüm mesajları şifrelemek istiyorsak, birden fazla bloğun tek bir şifreli metne şifrelenebileceği bir blok modu seçmemiz gerekir. En basit blok modu Elektronik Kod Kitabı veya ECB'dir . Her blokta aynı değiştirilmemiş anahtarı şu şekilde kullanır:
Bu özellikle kötüdür çünkü özdeş düz metin blokları aynı şifreli metin bloklarına şifrelenir.
Yalnızca 128 bit'ten küçük verileri şifrelemediğiniz sürece bu modu asla seçmemeyi unutmayın . Ne yazık ki, yine de sıklıkla kötüye kullanılmaktadır çünkü bir başlangıç vektörü sağlamanızı gerektirmez (daha sonra bunun hakkında daha fazla bilgi) ve bu nedenle bir geliştirici için kullanımı daha kolay görünmektedir .
Yine de bir durum blok modları ile ele alınmalıdır: son blok tam olarak 128 bit değilse ne olur ? Dolgu burada devreye giriyor, yani bloğun eksik kısımlarını dolduruyor. En basiti eksik bitleri sıfırlarla doldurur. AES'de dolgu seçiminde pratikte hiçbir güvenlik etkisi yoktur .
Öyleyse, ECB'ye ne gibi alternatifler var? Bir CBC vardır XOR önceki şifreli bloğu mevcut düz metin bloğu s. Bu şekilde, her şifreli metin bloğu o noktaya kadar işlenen tüm düz metin bloklarına bağlıdır. Sonuç öncekiyle aynı görüntünün kullanılması gürültü olur ve rastgele verilerden ayırt edilemez:
Peki ya ilk blok? En kolay yol, örneğin sıfırlarla dolu bir blok kullanmaktır, ancak o zaman aynı anahtar ve düz metne sahip her şifreleme aynı şifreli metinle sonuçlanacaktır. Ayrıca, aynı anahtarı farklı düz metinler için yeniden kullanırsanız, anahtarı kurtarmayı kolaylaştırır. Daha iyi bir yol, rastgele bir başlatma vektörü (IV) kullanmaktır. Bu, bir bloğun (128 bit) boyutuyla ilgili rastgele veriler için sadece süslü bir kelimedir. Şifrelemenin tuzu gibi düşünün , yani bir IV halka açık olabilir, rastgele olmalı ve yalnızca bir kez kullanılmalıdır. Yine de, IV'ü bilmemenin yalnızca ilk bloğun şifresinin çözülmesini engelleyeceğini unutmayın, çünkü CBC XOR bir öncekinin düz metnini değil şifreli metni yazmaktadır.
Diğer bir seçenek de CTR modunu kullanmaktır. Bu blok modu ilginçtir çünkü bir blok şifresini bir akış şifresine dönüştürür, bu da herhangi bir doldurma gerektirmediği anlamına gelir. Temel biçiminde tüm bloklar 0'dan n'ye kadar numaralandırılmıştır. Her blok şimdi anahtar, IV ( burada nonce olarak da adlandırılır ) ve sayaç değeri ile şifrelenecektir .
Avantajı, CBC'den farklı olarak, şifrelemenin paralel olarak yapılabilmesi ve tüm blokların yalnızca ilkine değil IV'e bağlı olmasıdır. Büyük bir uyarı, bir IV'ün asla aynı anahtarla tekrar kullanılmaması gerektiğidir , çünkü bir saldırgan kullanılan anahtarı ondan önemsiz bir şekilde hesaplayabilir .
Öyleyse ne yapabiliriz? Şifrelenmiş mesaja sadece Mesaj Kimlik Doğrulama Kodu (MAC) ekliyoruz . MAC, doğrulama ve kimlik doğrulama anahtarının hemen hemen aynı olması dışında, dijital imzaya benzer. Bu yöntemin farklı varyasyonları vardır, çoğu araştırmacı tarafından önerilen kipe Mac'ten Şifrele denir . Yani, şifrelemeden sonra şifre metni üzerinde bir MAC hesaplanır ve eklenir. MAC türü olarak genellikle Hash tabanlı mesaj kimlik doğrulama kodunu (HMAC) kullanırsınız .
Yani şimdi karmaşıklaşmaya başlıyor. Bütünlük / özgünlük için bir MAC algoritması seçmemiz, bir şifreleme etiketi modu seçmemiz, mac'i hesaplamamız ve eklememiz gerekir. Tüm mesajın iki kez işlenmesi gerektiğinden bu da yavaştır. Karşı taraf da aynı olmalı, ancak şifresini çözmek ve doğrulamak için.
Sizin için tüm kimlik doğrulama işlemlerini gerçekleştiren modlar olsaydı harika olmaz mıydı? Neyse ki , veriler üzerinde aynı anda gizlilik, bütünlük ve özgünlük güvencesi sağlayan, kimliği doğrulanmış şifreleme denen bir şey vardır . Bunu destekleyen en popüler blok modlarından biri, kısaca Galois / Counter Mode veya GCM'dir (örneğin , TLS v1.2'de bir şifre paketi olarak da mevcuttur )
GCM, temelde, şifreleme sırasında bir kimlik doğrulama etiketini sıralı olarak hesaplayan TO modudur. Bu kimlik doğrulama etiketi daha sonra genellikle şifre metnine eklenir. Boyutu önemli bir güvenlik özelliğidir, bu nedenle en az 128 bit uzunluğunda olmalıdır.
Düz metinde bulunmayan ek bilgileri doğrulamak da mümkündür. Bu verilere ilişkili veriler denir . Bu neden yararlıdır? Örneğin şifrelenmiş verilerin, içeriğin yeniden şifrelenmesi gerekip gerekmediğini kontrol etmek için kullanılan oluşturma tarihi olan bir meta özelliği vardır. Bir saldırgan artık oluşturma tarihini önemsiz bir şekilde değiştirebilir, ancak ilişkili veriler olarak eklenirse, GCM de bu bilgi parçasını doğrular ve değişikliği tanır.
Sezgiler şunu söylüyor: ne kadar büyük olursa o kadar iyidir - 256 bitlik rastgele bir değeri kaba kuvvetlendirmenin 128 bit'ten daha zor olduğu açıktır. Şu anki anlayışımızla, 128 bit uzunluğundaki bir kelimenin tüm değerleri aracılığıyla kaba kuvvet uygulamak , mantıklı bir zamanda (size bakmak, NSA) kimse için gerçekçi olmayan, astronomik olarak enerji gerektirir . Yani karar temelde sonsuz ve sonsuz çarpı 2¹²⁸ arasındadır.
AES aslında üç farklı anahtar boyutuna sahiptir, çünkü ABD federal hükümetinin [ordu dahil] kontrolü altında çeşitli alanlarda kullanılmak üzere ABD Federal Algoritma Apt olarak seçilmiştir. (…) Böylece ince askeri beyinler , en önemli sırların hak ettikleri ağır yöntemlerle şifrelenmesi için üç "güvenlik seviyesi" olması gerektiği fikrini ortaya attı , ancak daha düşük taktik değere sahip veriler şifrelenebilirdi. daha zayıfsa daha pratik algoritmalar. (…) Bu nedenle NIST , düzenlemeleri resmi olarak takip etmeye (üç temel boyut isteyin), ancak aynı zamanda akıllıca bir şey yapmaya karar verdi (en düşük düzey öngörülebilir teknolojiyle kırılmaz olmalıydı) ( Kaynak )
Argüman şu şekildedir: AES şifreli bir mesaj, muhtemelen anahtarı kaba zorlayarak kırılmayacaktır, ancak diğer daha ucuz saldırılarla (şu anda bilinmemektedir) kırılacaktır. Bu saldırılar, 256 bit mod kadar 128 bit anahtar modu için zararlı olacaktır, bu nedenle daha büyük bir anahtar boyutu seçmek bu durumda yardımcı olmaz.
Yani temelde 128 bit anahtar, kuantum bilgisayar koruması haricinde her kullanım durumunun çoğu için yeterli güvenliktir . Ayrıca 128 bit şifrelemeleri 256 bit'ten daha hızlı kullanmak ve 128 bit anahtarlar için anahtar çizelgesi , ilgili anahtar saldırılarına karşı daha iyi korunuyor gibi görünmektedir (ancak bu, çoğu gerçek dünya kullanımıyla ilgili değildir).
Yan kanal saldırıları , belirli uygulamalara özgü sorunları suistimal etmeyi amaçlayan saldırılardır . Şifreleme şifre şemalarının kendileri kendilerine karşı doğal olarak korunamazlar. Basit AES uygulamaları, diğerleri arasında zamanlama ve önbelleğe alma saldırılarına eğilimli olabilir .
Bir şekilde , çok basit, örneğin : zamanlama saldırılara eğilimli olan basit bir algoritma, bir
equals()iki gizli bayt dizileri karşılaştırır yöntemi. Eğer
equals()bu döngü biter eşleşmeyen bayt ilk çifti sonra, yani hızlı-getiri vardır, bir saldırganın için gereken süreyi ölçebilirsiniz
equals()tamamlamak ve tüm maça kadar byte için bayt tahmin edebilirsiniz.
AES üzerindeki zamanlama ve önbelleğe alma saldırıları sadece teorik değildir ve hatta bir ağ üzerinden kullanılabilir . Yan kanal saldırılarına karşı koruma, çoğunlukla kriptografik ilkelleri uygulayan geliştiricilerin endişesi olsa da, hangi kodlama uygulamalarının tüm rutinin güvenliğine zarar verebileceğini anlamak akıllıca olacaktır. En genel tema, zamanla ilgili gözlemlenebilir davranışın gizli verilere bağlı olmaması gerektiğidir. Ek olarak, hangi uygulamayı seçeceğiniz konusunda dikkatli olmalısınız. Örneğin OpenJDK ile Java 8+ kullanmak ve varsayılan JCA sağlayıcısı, sabit zamanlı olarak ve donanımda uygulanarak (yine de iyi performansa sahip olmakla birlikte) çoğu zamanlama ve önbelleğe alma saldırılarına karşı korunan Intel'in AES-NI komut setini dahili olarak kullanmalıdır . Android kullanır 's AndroidOpenSSLProvider içten donanım AES kullanabilir ( ARM TrustZone ) bağlı SoC , ama Im emin değil sahip olduğu aynı koruma Intelin pedant olarak. Ancak donanımı kolaylaştırsanız bile, güç analizi gibi başka saldırı vektörleri de mevcuttur . Bu sorunların çoğuna karşı koruma sağlamak için özel olarak tasarlanmış, yani bir donanım güvenlik modülü (HSM) olan özel donanım mevcuttur . Ne yazık ki bu cihazlar genellikle birkaç bin dolardan fazla tutuyor (eğlenceli gerçek: çip tabanlı kredi kartınız da bir HSM'dir).
Böylece nihayet pratik hale geliyor. Modern Java, ihtiyacımız olan tüm araçlara sahiptir, ancak kripto API'si en basit olanı olmayabilir. Dikkatli bir geliştirici, hangi uzunluk / boyutların / varsayılanların kullanılacağından emin olmayabilir. Not: Aksi belirtilmedikçe, her şey Java ve Android için eşit olarak geçerlidir.
Örneğimizde rastgele oluşturulmuş 128 bitlik bir anahtar kullanıyoruz. 192 ve 256 bit uzunluğunda bir anahtarı geçtiğinizde Java otomatik olarak doğru modu seçecektir. Bununla birlikte, 256 bit şifrelemenin genellikle JRE'nizde yüklü JCE Sınırsız Güçlü Yargı İlkesi'ni gerektirdiğini unutmayın (Android iyidir).
SecureRandom secureRandom = new SecureRandom(); byte[] key = new byte[16]; secureRandom.nextBytes(key); SecretKey secretKey = new SecretKeySpec(key, "AES");
byte[] iv = new byte[12]; //NEVER REUSE THIS IV WITH SAME KEY secureRandom.nextBytes(iv);
final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); GCMParameterSpec parameterSpec = new GCMParameterSpec(128, iv); //128 bit auth tag length cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec);
if (associatedData != null) { cipher.updateAAD(associatedData); }
byte[] cipherText = cipher.doFinal(plainText);
ByteBuffer byteBuffer = ByteBuffer.allocate(iv.length + cipherText.length); byteBuffer.put(iv); byteBuffer.put(cipherText); byte[] cipherMessage = byteBuffer.array();
Ve bu temelde şifreleme içindir. Mesajı oluşturmak için IV, şifrelenmiş veriler ve kimlik doğrulama etiketi tek bir bayt dizisine eklenir. (Java'da kimlik doğrulama etiketi otomatik olarak mesaja eklenir, bunu standart kripto API ile kendiniz yapmanın bir yolu yoktur).
Bir kriptografik anahtar veya IV gibi makul verileri bellekten olabildiğince hızlı silmeye çalışmak en iyi uygulamadır. Java, otomatik bellek yönetimine sahip bir dil olduğundan, aşağıdakilerin amaçlandığı gibi çalışacağına dair herhangi bir garantimiz yok, ancak çoğu durumda olması gerekir:
Arrays.fill(key,(byte) 0); //overwrite the content of key with zeros
Şimdi şifre çözme kısmına; Şifrelemeye benzer şekilde çalışır. Şifreyi IV ile başlatın ve isteğe bağlı ilişkili verileri ekleyin ve şifresini çözün:
final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); //use first 12 bytes for iv AlgorithmParameterSpec gcmIv = new GCMParameterSpec(128, cipherMessage, 0, 12); cipher.init(Cipher.DECRYPT_MODE, secretKey, gcmIv); if (associatedData != null) { cipher.updateAAD(associatedData); } //use everything from 12 bytes on as ciphertext byte[] plainText = cipher.doFinal(cipherMessage, 12, cipherMessage.length - 12);
Verilerimizi korumak için istediğimiz 3 özellik var
Merhaba Android geliştiricileri. Bu gönderide, bölüm başlıklarına sahip bir ızgara listesi oluşturmak için Geri Dönüştürücü Görünümünü kullanacağız.
Tam Disk Şifreleme Tam disk şifreleme, disk düzeyinde (adından da anlaşılacağı gibi) şifrelemedir ve dosya sistemi katmanının altında çalıştığı için kullanıcı için şeffaftır. Temel olarak bir blok cihaz şifrelemesidir, yani diskten bir blok okunduğunda (veya yazıldığında) çekirdek seviyesindeki şifreleme modülünün bir çevirmen gibi bizim için çalıştığı anlamına gelir.
Her artan bağımlılıkla, Gradle dosyasını yönetmemiz zorlaşıyor. Bu blogda, bağımlılıklarımızı başka bir dosyaya taşıyarak ve benzer bağımlılıkları gruplayarak yönetmeye çalışacağız.
Bu yazıda gerçek zamanlı olarak kameradan yüzdeki efektlerle Android uygulamasının nasıl yazılacağını anlatacağım. Burada tüm kilit noktalara değineceğiz: kamera ile çalışma, yüz bulma, yüzdeki noktaları bulma ve çizim sonucu.
Google Play Çekirdek Kitaplığı, uygulama içi incelemeler için destek ekleyerek kullanıcıların uygulamanızdan veya oyununuzdan ayrılmadan derecelendirme ve yorum göndermesine olanak tanır. Not Defteri uygulaması çalışma örneği aracılığıyla bu makale, bu özelliği Android'de nasıl uygulayacağınızı ve Google Play Store'daki görünürlüğünüzü nasıl etkileyebileceğini gösterecektir.
Bu makalede, size öğeleri yeniden sıralama olanağı sunan RecyclerView'ı nasıl uygulayacağınızı öğreneceksiniz. Bunu herhangi bir üçüncü taraf kitaplığı kullanmadan yapacağız.
Dwayne Johnson, uzun zamandır birlikte olduğu sevgilisi Lauren Hashian ile 2019 yılında evlendi. İşte nasıl tanıştıkları ve bu günlerde hayatlarında neler olup bittiği.
'90 Day Fiancé' yıldızı Steven Johnston, Alina ile olan hikayesinin korkutucu olmaya başladığını ve annesinin izlememesi gerektiğini açıkladı.
Netflix ve Sony, son 'Lady Chatterley's Lover' filminin başında. Joely Richardson ve Faye Marsay kadroya yeni katıldı.
TvN, Yoo Jae-Myung'un bir dizi cinayeti çözen bir dedektif olarak oynadığı 'Hometown' adlı yeni bir suç-gerilim K-dramı yayınlayacak.
Şabat, her Cuma gün batımından Cumartesi gecesine kadar gerçekleşen, Yahudi yaşamının merkezinde yer alan tatildir. Ama nedir ve nasıl gözlemlenir?
Amerika Birleşik Devletleri Başkanı olmak için en az 35 yaşında olmalısınız. Peki buna yaklaşan var mı?
Colorado, Granby'deki 2004 olayı, kasabanın yarısını yok etti. Şimdi 17 yıl sonra, kütüphaneyi ve belediye binasını çökerten tankın pilotu olan Marvin Heemeyer, hükümet karşıtı aşırılık yanlılarının kahramanı oldu.
HowStuffWorks'teki eğlenceli matematik oyunumuzla kayıp sayıyı bulabilecek misiniz bir bakın!
Bir NFL yan hakemine baktığımda "biftek" düşünüyorum. Bence “patateslerin parçalarını yığmak.
Bu görüntü yasal nedenlerle kaldırıldı. Eski Başkan George W.
Fotoğraf Kredisi: Christian Petersen/Getty Olanların üzerinden bir yıldan fazla bir süre sonra, Diamondback'lerin Shelby Miller ile takası, eski genel müdür Dave Stewart yönetiminde organizasyonun işlev bozukluğunun bir tür kolay sembolü olarak hizmet etmeye başladı. Ancak, küçüklerde uzun süreler içeren gerçekten sefil bir 2016'nın ardından, Miller, bu yılın başlarında, şimdiye kadar sahip olduğu en iyi bahar antrenman performansı ve muhteşem olmasa da mükemmel bir şekilde hizmet veren sezon başlangıcı ile kefaret için bazı adımlar attı.
Bu resim yasal nedenlerle kaldırıldı. GÜNCELLEME, 3/03, 10:12: The Intercept, Pazartesi günü Göçmenlik ve Gümrük Muhafaza dairesinin göçmenleri izlemek için özel Facebook verilerini kullandığını iddia eden raporunda önemli bir düzeltme yayınladı.
Alabama, Mobile'dan Jereme Lamond Jones, 1. Derece Cinayetle suçlandı ve 1.000.000 $'lık bir tahvili var.
Afgan savunucuları, Taliban'ın yeniden iktidara gelmesiyle birlikte kadınlar ve kızlar için başarıları, zorlukları ve korkuları anlatıyor
Küresel Kıdemli Papaz Houston bir e-postada "Kilise ailemizin şeffaflık adına bilmesini sağlamanın önemli olduğunu düşündüm ve bunu doğrudan benden duymanızı istedim" dedi.
Penelope Cruz İspanya'daki San Sebastian Film Festivali'ne gelirken, Sarah Jessica Parker New York'ta Ve Aynen Böyle... filmlerini çekiyor. En sevdiğiniz yıldızların neler yaptığını görün