Emre Kızıldaş
Published in

Emre Kızıldaş

Dosyalarınızı MinIO ‘ya Şifrelenmiş Biçimde Nasıl Yüklersiniz? — .Net Core MVC

Herkese selam! 🙌🏽 Öncelikle geçtiğimiz haftalarda yayınladığım MinIO Nedir? .NET Core Projelerinizde Nasıl Kullanılır? isimli makaleme olan ilginizden dolayı çok teşekkür ederim. Yayının ardından gelen geribildirimlere istinaden özellikle finans sektöründeki regülasyonlar sebebiyle verilerin güvenli biçimde ülkemizde saklanabilmesi konusunda oldukça faydalı bir yazı olduğunu farkettim.

Bu yazımda ise yine özellikle finans sektöründe ki yazılımcıların oldukça işine yarayacak aynı zamanda diğer sektörlerde de verilerini güvenli bir şekilde saklamalarına fayda sağlayacak olan kriptolu (şifrelenmiş) biçimde verilerin MinIO üzerinde nasıl saklanacağını anlatacağım. Hazırsanız başlayalım! 🚀

Öncelikle MinIO üzerinde server-side şifrelemenin detaylarından biraz bahsedelim. Burada dikkat edilmesi gereken en önemli nokta bir dosyası sunucuya yüklerken kullanılan şifreleme metodu, şifreleme anahtarı ile o dosyaya erişmek, indirmek istediğimizde kullanılacak metod ve anahtarın aynı olması gerekmektedir. Örneğin rastgele oluşturulan bir AES şifreleme anahtarı ile dosya yüklemesi yapabilirsiniz ancak o dosyaya bir daha erişmek istediğinizde birebir aynı anahtar ile erişmeniz gerekecektir. Bu sebeple şifreleme anahtarlarımızın rastgele belirlenmesi dosyalarımıza erişirken tercih edilmemelidir.

En dikkat çeken özelliği ise dosyanızı şifreli biçimde yüklediğinizde o dosyaya erişmek için yalnızca MinIO Client nesnesi üzerinden indirerek erişebilmeniz. Yani sunucunuzun fiziksel yoluna ulaşıp dosyayı açmaya çalışsanız dahi dosya açılmayarak sizlere hata verecektir. Bu yüzden bir şekilde dosyalarınızın bulunduğu sunucuya erişim sağlansa bile hiçbir dosyanız açılamayacaktır.

MinIO Şifreleme Teknolojisi

MinIO sunucu taraflı (server-side encryption) yaparken SSEC isimli nesnesini kullanmaktadır. SSEC içerisinde 256 bitlik byte dizisi alabilen bir nesnedir.

Bu nesneyi dilerseniz AES Algoritmalarıyla besleyebilirsiniz ya da kendi oluşturduğunuz bir byte dizisi ile şifrelemeyi yapabilirsiniz.

Bizler örneğimizde 256 bitlik bir şifreleme anahtarını kullanacağız. Şifreleme anahtarımızı 256 bitlik bir dizinin string değere convert edilmesiyle elde ediyoruz.

const string encryptionKey = "eHH+DMgfwG65z5Oc2dYTrEstqAMcqLiuSP5nXwVEvGM=";

Şifreleme anahtarımızı yukarıdaki şekilde oluşturdum. Bu anahtarı bir byte dizisine aşağıdaki kod bloğu yardımıyla çevirebiliriz.

byte[] vs = Convert.FromBase64String(encryptionKey);

Ardından MinIO tarafından kullanılan SSEC Nesnemizi oluşturalım ve içerisine byte dizisini parametre olacak gönderelim.

SSEC sSEC = new SSEC(vs);

Artık dosyalarımızı sunucularımızda saklarken yukarıdaki SSEC nesnesini kullanarak yükleme yapabiliriz. Bu sayede ilgili dosyalara fiziksel yolla erişilse bile dosyalar açılamayacaktır.

MinIO Sunucusuna dosyaları yüklerken sse parametresine yukarıda oluşturduğumuz SSEC Nesnesini göndermemiz yeterlidir.

minioClient.PutObjectAsync(bucketName, objectName, stream, stream.Length, contentType, sse: sSEC);

Bazı Püf Noktalar

Dosyalarımızı yüklerken kullanılan SSEC nesnesinin aynısını dosyalarımızı indirirken de kullanmamız gereklidir. Bu sebeple appsettings veya web.config dosyalarında byte dizisi değeri saklamak yerine sabit bir şifreleme anahtarı saklayıp bu anahtarı kullanırken byte dizisine kullanarak kullanmak daha doğru bir yöntem olacaktır.

MinIO şifreleme algoritmalarını kullanabilmesi için MinIO Sunucunuzun https bağlantısına sahip olması gereklidir. Bu sebeple client yaratırken aşağıdaki şekilde yaratmanız gereklidir.

MinioClient minioClient = new MinioClient(endPoint, accessKey, secretKey).WithSSL();

Nasıl SSL Sertifikasına sahip bir MinIO sunucusu kurabileceğinizi bu makalede detaylı bir şekilde anlatmışlar.

Son olarak controller nesnemizin kaynak kodları aşağıdaki gibi olacaktır:

--

--

Çeşitli yazılım dillerinde ve platformlarında projeler oluşturmak üzere paylaşımlarda bulunduğum kişisel blog.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store