it-swarm-tr.com

A Java Nesneyi güvenli bir şekilde silme

Bir Java nesnesini silmek için dize yerine karakter dizisi kullanmanız gerektiğini biliyorum, çünkü içeriğini güvenli bir şekilde silebilirim (karakter dizisini diğer verilerle yeniden yazabilirim). String nesneleri için uygulanabilir.

Şimdi BlackBerry üzerinde Java tabanlı, ben karakter dizisi olarak veri işlemek için bir API bulamadı ama ben String kullanmak zorundayım. Bu yüzden sorum, bir şifre saklamak durumunda bir nesneyi nasıl güvenli bir şekilde silebilirim?

33
smiley

Aslında yapamazsınız Java'da bir karakter dizisini gerçekten "güvenli bir şekilde silebilirsiniz". Java pratikte bellek nesnelerini hareket ettirecek zor bir yazılım parçası olan çöp toplayıcı yoluyla bellek ayırma yapar RAM = düzenli olarak. Yani "a char[] örneği "birkaç yere kopyalanacak ve silme işlemi fiziksel olarak yalnızca bu yerlerden birinde gerçekleşecek.

Bu bağlamda, "güvenli silme" Java'da gerçekten var olamaz. Java kullanıyorsanız, kullanım bağlamının güvenli silme işleminin gereksiz olacağı şekilde olduğundan emin olmalısınız: "güvenli silme" çoğunlukla işletim sistemi sıfırlanmamış RAM blok ( eski RAM) veya sanal bellek (RAM sabit diske kopyalanıyor) bölümleri) alıntılar alabilirsiniz. bunların bir BlackBerry için geçerli olmadığını tahmin edin, bu kadar basit String örneklerin iyi olması gerekir.

Bunu belirtmenin diğer bir yolu, String örneği parolalar için değil iyi ise, yalnızca şifre sızıntısından daha büyük güvenlik sorunlarınız vardır. Sonuçta, bazı verilere erişimi korumak için bir parola kullanırsınız, bu nedenle bir parola için "güvenli silmeye" ihtiyacınız varsa, oldukça mantıklı bir şekilde, korumalı veriler ve yaptığınız her şey için de "güvenli bir şekilde silmeniz" gerekir Bununla birlikte.

("Güvenli silme" kavramının büyük bir hayranı olmadığımı tahmin edebilirim.)

43
Thomas Pornin

bir nesnede şifre saklamam durumunda şifreyi nasıl güvenli bir şekilde silebilirim?

Bence demek istedin ki; cihaza erişimi olan bir saldırganın şifreyi kurtarmasını nasıl önleyebilirsiniz?

Saldırganın hangi erişim düzeyine eriştiğine bağlıdır.

Saldırgan, sağladığınız harici API ile sınırlıysa (iyi bir varsayım değil), Java.security.AccessController kullanarak erişim denetimi yeterli olmalıdır. Erişim denetimlerinizi doğru bir şekilde tasarlarsanız (yapmak çok zor) ve saldırgan erişim denetimlerini atlayamazsa, erişim denetimi saldırganın verileri almasını engeller.

Saldırgan Java sanal makine içinde ancak API'nizde değil) ile sınırlıysa, verileri KeyStore.PrivateKeyEntry ile korumanız gerekir. Bu düzeyde, verilerinizi korumak için tasarımınızı koruyun ve koruma sağlamak için Java sanal makineye güvenmeniz gerekir.

Saldırgan işletim sistemi ile sınırlıysa (Java sanal makine) değil, o zaman verilerinizi koruyamazsınız. Saldırgan Java Sanal makinenin tasarlandığı gibi çalışmaması durumunda, saldırgan Java güvenlik mekanizmasını atlayabilir).

Saldırganın cihaza fiziksel erişimi varsa, verilerin tüm saldırılara karşı korunması imkansızdır. Bu düzeyde, saldırgan RAM, flash, donanım modülleri vb.'ye yazılırken verileri okuyabilir.

6
this.josh