Bu, Google aracılığıyla görünen ilk sayfadır ve tüm uygulamalardaki güvenlik açıkları beni rahatsız ediyor, bu yüzden orijinal gönderiden 7 Yıl sonra başkaları için şifreleme ile ilgili bilgi eklemek için bunu gönderiyorum . Bilgisayar Mühendisliği Yüksek Lisans derecesine sahibim ve Kriptografi okuyup öğrenmek için çok zaman harcadım, bu yüzden interneti daha güvenli bir yer haline getirmek için iki sentimi harcıyorum.
Ayrıca, belirli bir durum için birçok uygulamanın güvenli olabileceğini, ancak neden bunları kullanıp potansiyel olarak yanlışlıkla bir hata yapabileceğinizi unutmayın? Kullanmamak için belirli bir nedeniniz yoksa, sahip olduğunuz en güçlü araçları kullanın. Genel olarak bir kütüphane kullanmanızı ve mümkünse zorlu ayrıntılardan uzak durmanızı şiddetle tavsiye ederim.
GÜNCELLEME 4/5/18: Onları daha basit anlamak ve recommended kütüphane değişti yapmak için bazı bölümlerini yeniden yazdı Jasypt için Google'ın yeni kütüphanesinde Tink tamamen kaldırılması öneriyoruz, Jasypt varolan kurulumundan.
Önsöz
Aşağıda güvenli simetrik kriptografinin temellerini ana hatlarıyla açıklayacağım ve insanlar standart Java kitaplığı ile kriptoyu kendi başlarına uygularken çevrimiçi olarak gördüğüm yaygın hatalara işaret edeceğim. Google'ın yeni kitaplığına aktarılan tüm ayrıntıları atlamak istiyorsanız, Tink bunu projenize aktarın ve tüm şifrelemeleriniz için AES-GCM modunu kullanın ve güvende olacaksınız.
Şimdi, javada nasıl şifreleneceğine dair nitty cesur ayrıntıları öğrenmek istiyorsanız okumaya devam edin :)
Blok Şifreleri
İlk önce simetrik bir anahtar Blok Şifresi seçmeniz gerekir. Bir Blok Şifreleme, Sözde Rastgelelik oluşturmak için kullanılan bir bilgisayar işlevi / programıdır. Sözde Rastgelelik, Kuantum Bilgisayarı dışında hiçbir bilgisayarın onunla gerçek rastgelelik arasındaki farkı söyleyemeyeceği sahte rastgeleliktir. Block Cipher, kriptografinin yapı taşı gibidir ve farklı modlar veya şemalarla kullanıldığında şifreler oluşturabiliriz.
Şimdi bugün blok şifreleme algoritmaları kullanılabilir ilgili, emin olun asla , ben yinelerseniz ASLA kullanmak DES , ben bile kullanmak asla derdim 3DES . Snowden'ın NSA sürümünün bile Pseudo-Random'a olabildiğince yakın olduğunu doğrulayabildiği tek Blok Şifresi AES 256'dır . Ayrıca AES 128 vardır; aradaki fark, AES 256'nın 256 bitlik bloklar halinde, AES 128'in ise 128 blok halinde çalışmasıdır. Sonuç olarak, AES 128, bazı zayıflıklar keşfedilmiş olmasına rağmen güvenli olarak kabul edilir, ancak 256 olabildiğince sağlamdır.
Eğlenceli gerçek DES , ilk kurulduğunda NSA tarafından kırılmıştı ve aslında birkaç yıl boyunca bir sır olarak saklamıştı. Bazı insanlar hala iddia rağmen 3DES güvenlidir, zayıflıklar bulundu ve analiz ettik epeyce araştırma kağıtları vardır 3DES .
Şifreleme Modları
Şifreleme, bir blok şifresi aldığınızda ve belirli bir şema kullandığınızda oluşturulur, böylece anahtarı bildiğiniz sürece tersine çevrilebilir bir şey oluşturmak için rasgeleliğin bir anahtarla birleştirilmesi sağlanır. Buna Şifreleme Modu denir.
İşte bir şifreleme modu örneği ve ECB olarak bilinen en basit mod, ne olduğunu görsel olarak anlayabilmeniz için:
İnternette en sık göreceğiniz şifreleme modları şunlardır:
ECB TO, CBC, GCM
Listelenenlerin dışında başka modlar da var ve araştırmacılar mevcut sorunları iyileştirmek için her zaman yeni modlar üzerinde çalışıyorlar.
Şimdi uygulamalara ve neyin güvenli olduğuna geçelim. ECB'yi ASLA kullanmayın, ünlü Linux pengueninin gösterdiği gibi, yinelenen verileri saklamakta kötüdür .
Java'da uygularken, aşağıdaki kodu kullanırsanız, ECB modunun varsayılan olarak ayarlandığını unutmayın:
Cipher cipher = Cipher.getInstance("AES");
... TEHLİKE BU BİR KIRILMAZLIKTIR! ve ne yazık ki bu, tüm StackOverflow'da ve çevrimiçi olarak öğreticiler ve örneklerde görülmektedir.
Nonces ve IV'ler
ECB modu ile bulunan soruna yanıt olarak IV olarak da bilinen ibareler oluşturuldu. Buradaki fikir, yeni bir rastgele değişken oluşturmamız ve bunu her şifrelemeye eklememizdir, böylece aynı olan iki mesajı şifrelediğinizde farklı çıkarlar. Bunun arkasındaki güzellik, bir IV veya nonce'nin kamuya açık bilgi olmasıdır. Bu, bir saldırganın buna erişebileceği anlamına gelir, ancak anahtarınıza sahip olmadığı sürece, bu bilgiyle hiçbir şey yapamaz.
Göreceğim yaygın konular, insanların IV'ü, kodlarındaki aynı sabit değerde olduğu gibi statik bir değer olarak ayarlayacak olmalarıdır. ve işte IV'lerin tuzağı, birini tekrarladığınız anda şifrelemenizin tüm güvenliğini tehlikeye atıyorsunuz.
Rastgele IV Oluşturmak
SecureRandom randomSecureRandom = SecureRandom.getInstance("SHA1PRNG");
byte[] iv = new byte[cipher.getBlockSize()];
randomSecureRandom.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);
Not: SHA1 bozuldu, ancak SHA256'yı bu kullanım senaryosuna nasıl düzgün bir şekilde uygulayacağımı bulamadım, bu yüzden herhangi biri bu konuda bir çatlak alıp güncelleme yapmak isterse harika olurdu! Ayrıca SHA1 saldırıları, büyük bir kümede kırılması birkaç yıl sürebileceğinden hala alışılmadık. Ayrıntılara buradan göz atın.
TO Uygulaması
TO modu için dolgu gerekmez.
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
CBC Uygulaması
CBC Modunu uygulamayı seçerseniz, bunu PKCS7Padding ile aşağıdaki gibi yapın:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
CBC ve CTR Güvenlik Açığı ve GCM'yi Neden Kullanmalısınız?
CBC ve CTR gibi diğer bazı modlar güvenli olsa da, bir saldırganın şifrelenmiş verileri çevirip şifresi çözüldüğünde değerini değiştirebileceği sorunuyla karşılaşırlar. Diyelim ki hayali bir banka mesajını şifrelediniz, şifrelenmiş mesajınız şu "eu23ng" gibi görünüyor, saldırgan bir bit "eu53ng" olarak değişiyor ve mesajınızın şifresini çözdüğünde aniden "900 Sat" olarak okuyor.
Bunu önlemek için internetin çoğu GCM kullanıyor ve HTTPS'yi her gördüğünüzde muhtemelen GCM kullanıyorlar. GCM, şifrelenmiş mesajı bir hash ile imzalar ve mesajın bu imzayı kullanarak değiştirilmediğini kontrol eder.
Karmaşıklığı nedeniyle GCM'yi uygulamaktan kaçınırdım. Google’ın yeni kitaplığı Tink’i kullanmakta daha iyisiniz, çünkü burada yine yanlışlıkla IV’i tekrarlarsanız, en büyük güvenlik kusuru olan GCM’deki durumda anahtarı tehlikeye atmış olursunuz. Yeni araştırmacılar, IV'ü tekrarlasanız bile anahtarın tehlikede olmadığı ancak bu henüz ana akım haline gelmediği IV tekrar dirençli şifreleme modları üzerinde çalışıyorlar.
Şimdi, GCM'yi uygulamak istiyorsanız, işte güzel bir GCM uygulamasına bir bağlantı . Ancak, güvenliği sağlayamıyorum veya düzgün uygulanıyorsa, ancak temeli indiriyor. Ayrıca, GCM'de dolgu olmadığını unutmayın.
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
Anahtarlar ve Şifreler
Bir diğer önemli not da, kriptografi söz konusu olduğunda bir Anahtar ve Parola aynı şeyler değildir. Kriptografide bir Anahtarın güvenli olarak kabul edilebilmesi için belirli bir miktarda entropi ve rasgeleliğe sahip olması gerekir. Bu nedenle, sizin için anahtarı oluşturmak için uygun şifreleme kitaplıklarını kullandığınızdan emin olmanız gerekir.
Yani burada gerçekten yapabileceğiniz iki uygulama var, ilki bu StackOverflow iş parçacığında bulunan kodu Random Key Generation için kullanmaktır . Bu çözüm, kullanabileceğiniz sıfırdan bir anahtar oluşturmak için güvenli bir rastgele sayı üreteci kullanır.
Daha az güvenli olan diğer seçenek, şifre gibi kullanıcı girişi kullanmaktır. Tartıştığımız konu, şifrenin yeterli entropiye sahip olmamasıdır, bu nedenle şifreyi alan ve güçlendiren bir algoritma olan PBKDF2'yi kullanmak zorunda kalacağız . İşte sevdiğim bir StackOverflow uygulaması . Bununla birlikte, Google Tink kitaplığı tüm bunlara sahiptir ve bundan yararlanmalısınız.
Android Geliştiricileri
Burada belirtilmesi gereken önemli bir nokta, android kodunuzun tersine mühendisliğe tabi tutulabilir olduğunu ve çoğu durumda çoğu java kodunun da öyle olduğunu bilmektir. Bu, parolayı kodunuzda düz metin olarak saklamanız anlamına gelir. Bir bilgisayar korsanı onu kolayca bulabilir. Genellikle, bu tür şifreleme için Asimetrik Şifreleme vb. Kullanmak istersiniz. Bu, bu yazının kapsamı dışındadır, bu yüzden ona dalmaktan kaçınacağım.
Bir 2013 ilginç okuma : Android'de Kripto uygulamaların% 88 yanlış olduğu fikrine sahip Noktaları.
Son düşünceler
Bir kez daha java kitaplığını kripto için doğrudan uygulamaktan kaçınmanızı ve Google Tink'i kullanmanızı öneririm , tüm algoritmaları doğru bir şekilde uygulamak konusunda gerçekten iyi bir iş çıkardıkları için sizi baş ağrısından kurtaracaktır. Ve o zaman bile Tink github'da ortaya çıkan sorunları, burada ve orada güvenlik açıkları açılır penceresini kontrol ettiğinizden emin olun.
Herhangi bir sorunuz veya geri bildiriminiz varsa yorum yapmaktan çekinmeyin! Güvenlik sürekli değişiyor ve buna ayak uydurmak için elinizden gelenin en iyisini yapmanız gerekiyor :)