PC'de mega bulut depolama indir. MEGA bulut depolamasında kriptografinin kontrolünü ele alma

  • 03.08.2019

Mega bulut, çeşitli dosyalar, fotoğraflar, videolar ve belgeler için oldukça popüler bir depolama alanıdır. Sitede hesabını oluşturan her kullanıcıya tamamen ücretsiz 50 GB ücretsiz depolama alanı sağlanmaktadır. İleride bu hacim ek bir ücret karşılığında artırılabilir, örneğin 4 TB aylık 30 dolara satın alabilirsiniz.

Şimdi Mega bulut hakkında bir inceleme yapmak ve başlıca avantajlarından bahsetmek istiyorum. Birçok kullanıcı, bu bulut depolamayı fiyat ve sağlanan boş alan açısından en karlı olarak adlandırır. Ayrıca, orada çok sık çeşitli promosyonlar yapılır, örneğin, bir yıl boyunca bir paket satın alabilir ve iki ay tamamen ücretsiz alabilirsiniz, bu da oldukça ciddi bir miktar tasarruf sağlayacaktır.

Ana avantajlar

Şimdi okuyucularıma Mega depolamanın ana avantajlarını anlatacağım:

  • hizmet çok dillidir, bu nedenle kullanıcılar yabancı dil bilmemekten kaynaklanan herhangi bir zorluk yaşamazlar. Bulut depolama ile çalışmaya başlamadan önce istediğiniz dili seçebilirsiniz;
  • kayıttan hemen sonra tamamen ücretsiz olarak sağlanan yeterli disk alanı;
  • Bunun için herhangi bir kısıtlama olmadığı için herhangi bir boyut ve uzantıdaki dosyaları yükleyebilirsiniz;
  • dosyaları şifreli erişim kullanarak arkadaşlarınıza aktarın. Şifreleme, tarayıcıda özel bir algoritma kullanılarak gerçekleştirilir, böylece kullanıcılar kişisel dosyalara yetkisiz erişime karşı güvenilir bir şekilde korunur.

Kayıt

Mega bulut depolamayı kullanmaya başlamak için resmi web sitesine kaydolmanız gerekir. Bu gerektirir:

Önemli! Formu doldururken herhangi bir veri girebilirsiniz. Ancak e-posta adresi gerçek olmalıdır, aksi takdirde bulut depolamayı kullanmaya başlayamazsınız.

işin başlangıcı

Kayıt tamamlandıktan sonra Mega dosya deposu kullanıma hazırdır. Başlamak için ihtiyacınız olan:

  1. Ücretsiz olarak sağlanan 50 GB gibi boş alan miktarını seçin ve "Bitir" düğmesine tıklayın.
  2. "Dosya Yükle" düğmesine tıklayın ve buluta yüklemek için bilgisayarınızdan gerekli dosyayı seçin.

Depoya yüklenecek tüm klasörler, fotoğraflar ve belgeler herhangi bir bilgisayardan veya başka bir cihazdan görüntülenebilir.

Giriş

Bir bilgisayardan Mega Dosya Deposuna girmek için şunlara ihtiyacınız olacak:


Bu konuda internette bulabileceğiniz incelemeleri Mega hakkındaki makalemi bitirmek istiyorum. Ayrı olarak, tarayıcıyı kullananların, dosyaları buluta yükleme hızını önemli ölçüde artırabilecek özel bir MEGA eklentisi yükleyebileceğini eklemek istiyorum. Ayrıca, eklentiyi yükledikten sonra, dosyaları sınırsız miktarda toplu olarak indirebilirsiniz. Herhangi bir uygulama yüklemeden bir tarayıcı kullanmak en iyisidir.

Mega Cloud Storage, 50 GB'a kadar artan boş disk alanına sahip benzer kaplar arasında öne çıkan modern bir sanal bilgi deposudur. Blackberry, iOS, Android ve Windows Mobile tabanlı taşınabilir cihazlardan erişim desteklenir. Hizmetin kurucuları, daha önce bilinen Megaupload dosya barındırma hizmetinin geliştiricileridir.

yetenekler:

  • büyük miktarda boş alana (50 GB) sahip bir sanal dosya kabı;
  • AES algoritmasını kullanarak veri şifreleme;
  • mobil cihazlar için destek;
  • Chrome ve Firefox için eklentilerin kullanılabilirliği;
  • Rusça arayüz.

Çalışma prensibi:

indirip başlattıktan sonra yardımcı program sizden hesap bilgilerini girmenizi ister - hizmeti kayıt olmadan kullanamazsınız. Ardından, senkronizasyon türünü seçmelisiniz - tam (tüm bilgiler "bulut" a aktarılır) veya seçici (belirli dizinler).

Parametreleri girdikten sonra uygulama sistem tepsisine "kıvrılır". Simgeye tıklayarak boş alanı görüntüleyebilir ve veri paylaşımı için yeni klasörler ekleyebilirsiniz.

Program arayüzü penceresi mantıksal olarak beş sekmeye bölünmüştür. Rus yerelleştirmesi sayesinde deneyimsiz kullanıcılar bile işlevsellikle başa çıkabilecek. Bize göre en “lezzetli” son bölümdedir (“Gelişmiş” düğmesi). İçinde, belirli nesne türleri için ayrı bir senkronizasyon algoritması ayarlayabilirsiniz.

Artıları:

  • büyük miktarda "bulut";
  • esnek fiyat teklifleri;
  • dosyaları paylaşmak için kişisel koşullar belirleyebilirsiniz.

eksileri:

  • Runet'te az sayıda kullanıcı;
  • çok sayıda kullanıcı tarafından "buluttan" veri indirilirken trafikte kısıtlamalar vardır.

Mega Cloud, seçkin Google Drive'a bile layık bir rakip. Depo, sadeliği, yüksek güvenliği ve popüler platformlar için istemcileri ile etkileyicidir. Kurumsal müşteriler, geliştiricilerin sadık fiyatlandırma politikasını ve büyük miktarda sanal depolama alanı sipariş etme olanağını beğeneceklerdir. Örneğin, Pro III planı 4 TB'a kadar alan sunar.

Analoglar:

  • Yandex.Disk - en popüler arama motoru Runet'in geliştiricilerinden sanal depolama;
  • Copy Cloud Storage, güçlü bir güvenli arşivdir.

Mega, kullanıcılara ücretsiz olarak veri depolamak için 50 GB disk alanı sunan bir bulut depolama alanıdır. Sabit sürücüye böyle bir bellek artışı hiç kimse için gereksiz olmayacaktır.

Uzantı, bir tarayıcı aracılığıyla bulut depolamaya erişim sağlar. Bu, önyükleme sürelerini azaltır, performansı artırır ve güvenliği artırır. MEGA disk depolama hakkında konuşurken, küresel güvenli erişimden bahsediyoruz. Bir tarayıcı uzantısı kullanarak, gerekli dosyalar gece gündüz kullanılabilir olacaktır. MEGA uçtan uca şifreleme sağlar. Bu, mesajların, fotoğrafların, videoların yanlış ellere düşmekten korunduğu anlamına gelir. Yalnızca kişisel verilere erişimi olan bulut depoları sizin kontrolünüz altındadır. MEGA'nın bile bunlara erişimi yok! Diğer çoğu bulut hizmetinden farklı olarak, MEGA geliştiricileri güvenli işbirliğini temsil eder. Bu, bilgileri paylaşmanıza, kişilerle bağlantı kurmanıza, güncellemeleri gerçek zamanlı olarak görüntülemenize olanak tanır.

Geniş depolama alanı

MEGA sadece rekabetten daha güvenli değil. Sağlanan ücretsiz depolama alanı miktarı diğerlerinden çok daha fazladır. Gerçek zamanlı dosya senkronizasyon işlevi sayesinde tüm dosyalar güvenlidir ve gerektiğinde geri yüklenebilir. MEGA, kriptografik modelin doğruluğunun ve bütünlüğünün ve bunun uygulanmasının bağımsız doğrulamasını sağlamak için, istemci uygulamalarının tam kaynak kodunu yayınlar. Ve memnun ediyor!

Günümüzde İnternet, birbirine benzeyen çok sayıda dosya deposu sunmaktadır. İlk akla gelen Yandex.Disk, Google Drive, Dropbox, OneDrive'dır. MEGA'yı rakiplerinden ayıran şey, kayıtlı kullanıcılar için ücretsiz 50 GB disk depolama alanı sağlamasıdır. MEGA, buluta yüklenen dosyaların boyutunu sınırlamaz.

Bilgisayarınızın sabit diskindeki 40 GB'ın satın alınamayacak bir lüks gibi göründüğü zamanları hatırlıyor musunuz? Şimdi fatura yüzlerce gigabayta ve genellikle terabayta gidiyor ve buna o kadar alıştık ki, PC disklerinde ayrım gözetmeksizin - herhangi bir şeyle - yer kaplıyoruz.

Bu arada, henüz hiç kimse tasarruf ve konforu iptal etmedi ve bulut depolamanın varlığı, refahı ve parlak beklentileri, uygulanabilirliklerini kanıtlıyor. Son birkaç yılda, bu tür İnternet servislerinin hizmetleri dev adımlarla gelişiyor ve birkaç bulut veri deposu örnek olarak gösterilebilir:

1. Yandex.Disk - yeni başlayanlara farklı biçim ve uzantılardaki dosyaları depolamak için 5 GB boş alan ve ayrıca çeşitli bonuslar sunar. Örneğin, Yandex postasını 5 yıldır kullanıyorsanız, size 2 GB daha disk alanı verilecektir.
2. Google Drive - 15 GB boş alan.
3. Microsoft SkyDrive - Daha önce sunulan 25 GB yerine 7 GB ücretsiz.
4. - Yönlendirmeleri çekmek için 2 GB artı disk alanı genişletmesi.
5. Apple iCloud - 5 gigabaytlık boş alan.
6. - Burada her not için en fazla 40 MB ücretsiz ödünç alabilir ve aylık 60 MB'a kadar not yazmak / düzenlemek için trafik miktarını kullanabilirsiniz.
7. Amazon Google Drive - 5 GB.
8. Bulut hizmeti Kutusu - 5 GB.
9. SugarSync hizmeti - 5 GB.
10. Bulut depolama Mega.co.nz - 50 GB boş disk alanı.

Bulut depolama Mega.co.nz

Yukarıdaki hizmetlerin tümü, yalnızca sabit bilgisayarlarda değil, şüphesiz uygulamalarının kapsamını genişleten ve popülerliklerini artıran tüm mobil uygulamalarda da çalışabilir. Ancak sunulan ücretsiz gigabaytlar açısından lider hala Mega.co.nz - 50 GB bir şaka değil, hala bir şeylerle doldurulmaları gerekiyor, bu yüzden bu bulut hizmeti hakkında daha fazla konuşmayı öneriyorum - Mega.co.nz. Bu arada, istikrarlı, anonim ve yaratıcıları tanınmış insanlar olduğu için bu hizmeti aktif olarak kullanıyorum.

Bu depolama hizmetlerini sunan şirketin başkanı - Kim Dotcom, Adalet Bakanlığı ve Amerika FBI'ın önerisiyle iki yıl önce kapatılan Megaupload hizmetinin kurucusu. O hikayeyi hatırlayabilirsin. Aslında eski eşanjörleri oldukça uygun bir şeydi. Ama şimdi Kim'in yeni beyni daha da havalı hale geldi. Bunun hakkında daha ayrıntılı konuşalım.

Artık Mega hizmet, yalnızca bir PC kullanarak bulutta verilerin olağan depolanmasını sağlamakla kalmıyor, aynı zamanda geliştiricilerin daha önce söz verdiği gibi, mobil cihazlardan çalışma yeteneğini de dahil ettiler - iPhone, iPad, cihazlar üzerinde, Win 8, mount Windows için dosya sistemi vb. Yani dosyaları doğrudan buluta göndermek mümkün olacak. Örneğin, akıllı telefonunuzdaki fotoğraflarınız gadget'ta saklanacak, ancak aynı zamanda Mega.co.nz'e de aktarılacak, böylece beklenmedik kayıp veya dosyalara zarar verme olasılığı tamamen ortadan kaldırılacaktır. Tüm verileriniz aktarım sırasında şifrelenir ve sizden başka hiç kimse okumak için paketini açamaz.

Mega'nın avantajları ve farklılıkları

1. Mega.co.nz bulut hizmetinin benzer kaynaklardan temel özelliği ve farkı, sunulan ilk 50 GB boş disk alanıdır. Mega.co.nz'de herhangi bir boyutta, herhangi bir uzantıda, herhangi bir formatta dosya yükleyebilirsiniz - bu konuda herhangi bir kısıtlama yoktur.

2. MEGA kısaltması, "MEGA Şifreli Küresel Erişim"in (MEGA şifreli küresel erişim) adıdır.

3. Mega'nın temel özellikleri diğer kaynaklarla aynıdır - indirme, dosyaları üçüncü taraf bir sürücüde depolama ve bağlantıları aktararak veya şifreli erişim yoluyla arkadaşlarınızla ve iş arkadaşlarınızla dosya paylaşma yeteneğidir. Tarayıcıdaki dosyalar AES algoritması kullanılarak şifrelenir, yani yetkisiz erişime karşı korunursunuz. Dosya aktarma bağlantıları da şifrelenir ve hizmet çalışanlarının bile verilerinize erişimi yoktur. En azından bunu iddia ediyorlar.

4. Mega dosya alışverişi ve depolama hizmeti çok dillidir, bu nedenle onunla çalışırken herhangi bir dil sorunu yaşamayacaksınız - sadece kontrol panelinde istediğiniz dili seçin.

Ancak bulut depolamayı kullanmaya başlamak için basit bir kayıt prosedüründen geçmeniz gerekir.

Mega.co.nz'de kayıt ve başlangıç

Kayıt linkinden de görebileceğiniz gibi https://mega.co.nz/ sitesine giriş güvenli bir bağlantı üzerinden gerçekleşmektedir. Ana sayfada ayrıca, uygun çalışma için Rusça dilini seçmeniz gerekir - menü sağ üstte bulunur. Şimdi kayıt olabilirsiniz:

Kayıt olurken gerçek bir e-posta adresine ihtiyacınız var, verilerin geri kalanı basitçe kafanızdan alınabilir. Tüm alanları doldurup "Hesap oluştur" butonuna tıkladıktan sonra, mailimize kaydımız için onay linki içeren bir e-posta gönderilecektir:

Mektuptaki bu bağlantıya tıklayın ve hizmet sayfasında hesabınızı onaylayın - bunun için sağ üst köşede bir form var, yani sadece e-posta adresinizi ve şifrenizi girin. Bu bir kez yapılır - o zaman hizmet tarayıcımızın çerezlerini kullanır. Kayıt onayının ardından, kimlik doğrulamamızı belirleyecek olan kendi bireysel anahtarımızı oluşturmamız istenecektir. Anahtar oluşturmak, doğası gereği eğlencelidir ve hatta anahtarın zaten oluşturulduğu anı atlayarak çok sert oynadım.

Oyun, MEGA yazıtını oluşturan tuğlaları deviren bir top gibi görünüyor. Ekranın üst kısmındaki ölçekte %100'e ulaştığınızda, anahtar oluşturulacaktır:

Ve “Son” düğmesine tıkladıktan sonra Mega.co.nz bulut hizmetindeki sayfanıza gidin:

Mega.co.nz hizmeti nasıl kullanılır?

Aşağıda tartışacağım Google Chrome ve üzerinde çalışırken hizmeti kullanmak arasında çok küçük bir fark var. Bu arada - genel kontrol ve kullanım noktaları hakkında. Sayfanızın sağ tarafında bir kontrol sütunu ve depolama yapısının bir görüntüsünü görürsünüz. En üstte - dosyaları yüklemek ve görüntülemek ve bunları yönetmek için bir menü. Yani, önceden yüklenmiş dosyaların bulunduğu açılır menüde, dosyaya bağlantı alma, kopyalama, düzenleme vb.

Mozilla Firefox tarayıcı kullanıcıları tarayıcılarına bir eklenti yükleyebilir MEGA uzantısı. Bu eklentinin geliştiricileri, yükledikten sonra dosya indirme hızında önemli bir gelişme göreceğinize söz veriyor. Bu sonuç, boyutlarını sınırlamadan sınırsız sayıda dosyanın toplu olarak yüklenmesiyle sağlanır. Mega.co.nz hizmetindeki her bağlantı, MEGA uzantı uygulamanız tarafından yakalanır ve yerel kalır (Javascript'ler sunuculardan indirilmez). Hizmet, şifreli bir anahtara sahip kriptografik imza sayesinde güvenilir otomatik güncellemeler sağlar.

Geliştiriciler, Mega hizmetle daha verimli çalışma için bu eklentiyi yüklemeden Google Chrome tarayıcısını kullanmanızı önerir. Bilgisayar hayatım boyunca aynı anda birkaç tarayıcı kullandığım için, önerilen uzantıyı Firefox'a da yükledim, ancak dürüst olmak gerekirse, bulut hizmetinin çalışmasında herhangi bir fark görmedim. Uygulama hem tarayıcının "Eklentilerinden" hem de MEGA hizmetinden ("Menü" - "Uygulamalar" - "Firefox uygulaması") yüklenebilir.

Dosya içeren tüm klasörleri buluta yükleyecekseniz Google Chrome tarayıcısını kullanmak daha iyidir - Mozilla'da böyle bir olasılık yoktur ve Chrome hem dosya hem de klasör yükleyebilir:

Google Chrome tarayıcısında depolama kontrol paneli böyle görünür ve Mozilla Firefox'ta sadece “Klasör yükle” düğmesi yoktur - yalnızca “Dosya yükle” düğmesi vardır. "Dosya yükle" düğmesini kullanarak kişisel bilgisayarınızdan buluta bir dosya yükleyebilirsiniz. Google Chrome'da "Klasörü yükle" düğmesini tıkladıktan sonra, Explorer penceresi açılır, dosya deposuna yüklemek için içindeki klasörü seçin ve işte bu kadar - indirme başladı.

Şimdi Firefox'ta bu sorunu nasıl çözeceğiniz hakkında. Diyelim ki bir klasörün tamamını indirmek istiyorsunuz - bunun için yeni bir tarayıcı kurmayın! Ardından, Mega'da (menüdeki "Yeni klasör" öğesi) aynı ada sahip bir klasör oluşturmanız ve aynı klasörde bulunan tüm dosyaları (hepsini bir kerede seçmek için Ctrl + A tuşlarına basın) yüklemeniz yeterlidir. bilgisayar.

Hizmetle tanışmaya devam ediyoruz. "Hesabım" bölümünde, yalnızca ücretsiz bir hesap kullandığınızı değil, kullandığınız bulut alanı miktarını da göreceksiniz ve profil ayarlarınızı değiştirebilir veya veri aktarımını ayarlayabilirsiniz:

Ayarlarda ("Menü" - "Hesabım") çok şey yapabilirsiniz. Örneğin, dosyaları indirmek için paralel bağlantıların sayısını ve dosya indirmek için paralel bağlantıların sayısını değiştirin. İndirme hızına da bir sınır koyabilirsiniz.

"Menü" - "Hesabım" menü düğmesine tıklarsanız, Mega.co.nz bulut hizmetini kullanma kuralları hakkında daha fazla bilgi edinebilirsiniz. Henüz kullanmadığım için size Pro hesabı hakkında fazla bir şey söylemeyeceğim - ücretsiz 50 GB yeterli. Ancak ücretsiz hesabınızdaki "Durumunuzu Yükseltin" düğmesine tıkladığınızda, 500 GB'den 96 TB'a kadar daha fazla verinizi bulutta depolayabilmek için ücretli paketlerden herhangi birini seçebilirsiniz. Şahsen böyle bir hacmim var - 96 terabayt - Kötü bir fikrim var, ancak yine de dikkatlice düşünürseniz uygulama bulabilirsiniz. Örneğin, site veritabanlarını yedeklemek vb.

Dosyalarla çalışmaya devam edelim - içine bazı tematik dosyaları yüklemek için yeni bir klasör oluşturabilirsiniz. Bunu yapmak için "Yeni Klasör" düğmesine tıklayın ve klasörü istediğiniz gibi yeniden adlandırın. Bu yeni klasörde, halihazırda dosya yükleyebileceğiniz başka alt klasörler de oluşturabilirsiniz. Bir klasöre (dosya) sağ fare tuşuyla tıklarsanız, açılır içerik menüsünde klasör (dosya) ile eylemleriniz için karşılık gelen komutları görebilirsiniz. Gördüğünüz gibi, diğer kullanıcılara aktarmak için bir bağlantı alma yeteneği de dahil olmak üzere birçok olasılık var. Bağlantı şifrelenecektir.

Bulut ayarlarınızda dosya indirme hızını sınırlamadıysanız, veri indirme hızı sınırsız olacak ve yalnızca bilgisayarınızın İnternet bağlantısının hızına bağlı olacaktır. Ayrıca, klasörler / dosyalar ile çalışmak normal bir bilgisayardakiyle tamamen aynıdır - bunları düzenleyebilir, bağlantılarını alabilir, taşıyabilir, paylaşılmasına izin verebilir, kopyalayabilir vb. Dosya yükleme ve indirme işlemi, hizmette sayfanın altında sağda görüntülenir - simgeye tıklayın

Klasörler nasıl paylaşılır

Mega conz bulut depolamada saklayacağınız klasörler paylaşıma ayarlanabilir. Bunu yapmak için, klasöre sağ tıklayın ve açılır içerik menüsünde "Paylaşım"a tıklayın. Ardından, paylaşım hakları vermek istediğiniz kullanıcının e-posta adresini belirtmeniz gereken "Paylaşım" penceresini göreceksiniz. Bu kullanıcı için hakları ayarlayabilirsiniz - örneğin, hakları "Salt Okunur", "Oku ve Yaz", "Tam Kontrol" olarak ayarlayın. Paylaşım hakları, ayarladığınız izinlere sahip kullanıcıların dosyaları düzenlemesine, yalnızca görüntülemesine veya yalnızca indirmesine izin verebilir. Bu tür herhangi bir sayıda kullanıcı olabilir.

Paylaşım için e-posta adresini belirledikten sonra, hizmete gitmek ve belirtilen klasöre erişmek için gerekli olan bir bağlantı ile postasına bir e-posta gönderilecektir. Paylaşılan klasörler, diğer bulut depolama klasörlerinden biraz farklı görünür ve şöyle görünür:

Mega.co.nz'de bağlantı nasıl alınır

Mega.co.nz hizmeti, diğer kullanıcılara Mega bulut hizmetinde barındırdığınız dosyaları indirmeleri için bağlantılar sağlama yeteneğine sahiptir. Böyle bir bağlantı elde etmek için dosyaya sağ tıklamanız ve açılır içerik menüsünde "Bağlantıyı al" menü öğesine tıklamanız gerekir. Açılan yeni bir pencerede, dosyayı indirmek için (şifreli veya şifresiz) bağlantınızı göreceksiniz. Genel olarak, Mega.co.nz bulut hizmetinde dosya indirmeye yönelik tüm bağlantılar iki türde yayınlanır ve bağlantı türü, güvenlik anahtarlarının gizlilik derecesine bağlı olacaktır.

Bağlantının kendisi şifrelenmemiş biçimde oluşturulmuşsa, dosya yine de şifreli olarak iletilir ve yalnızca kullanıcı bu bağlantıyı takip etmişse dosyanın şifresi çözülür ve indirilebilir hale gelir. Yani birisi bu dosyayı indirene kadar şifrelenmiş biçimde saklanacaktır. Bağlantının kendisi şifrelenmişse, yalnızca dosyanın bağlantısını özel bir güvenlik koduyla (anahtar) alan kullanıcı dosyayı bu bağlantıdan indirebilir. Bu güvenlik kodu olmadan alıcı, dosyayı bağlantıdan indiremez.

Aşağıdaki resimde görebilirsiniz - "Bir dosya anahtarıyla" öğesi etkinleştirilirse, şifreli kod bağlantının kendisine gömülür ve tüm kullanıcılar tarafından indirilebilir. Ve bunun tersi - bu kutuyu işaretlemezseniz, adres kullanıcısı dosyayı yalnızca ayrı olarak ilettiğiniz anahtarı girerse indirebilir.

Ayrıca, dosya bağlantısının amaçlandığı kullanıcı, dosyayı Mega.co.nz'de bulunan bulutlarına kaydedebilir. Bunu yapmak için, bağlantıyı aldıktan sonra "İçe Aktar" düğmesini tıklamanız gerekir. Bu seçenekle, bağlantı bilgisayara indirilmez, sadece bir hesaptan diğerine taşınır. Böyle bir işlemi gerçekleştirmek için, alıcının Mega.co.nz bulutunda, örneğin . Tüm bu olasılıkları aşağıdaki resimde görebilirsiniz:

Tek bir anahtarla bir bağlantı nasıl indirilir (ikinci seçenek)? Aşağıdaki resimde onun çözümünü görüyorsunuz. Ayrı olarak aktarılan bir anahtar durumunda, alıcı sizden dosyayı bulut deposundan indirmek için hem bir bağlantı hem de bir anahtar alırsa dosyayı indirebilir. Dosyayı aktarırken kopyalayarak anahtarın kendisini alacaksınız (yukarıdaki şekilde - “Anahtarları kopyala” öğesi). Kullanıcıya normal bir e-posta ile gönderdiğiniz tüm bu veriler (hem paylaşım bağlantısı hem de ayrı bir anahtara sahip bağlantı).

"Şifresini Çöz" bağlantısına tıkladıktan sonra, yeni bir pencerede, kullanıcının dosyayı indirmek veya kendi bulut deposuna kaydetmek için sizden aldığı güvenlik anahtarını girmesi gerekecektir. Anahtar girildikten sonra, kullanıcının "İndir" düğmesini tıklaması ve "MEGA hizmet şartlarını kabul ediyorum" kutusunu işaretlemesi veya dosyayı bulutlarına aktarması gerekir.

Dosya tamamen indirildikten sonra, "İndirme Tamamlandı" penceresi açılacak ve bu pencerede kullanıcıdan indirmeyi tamamlamak için dosyayı bilgisayardaki herhangi bir uygun yere manuel olarak kaydetmesi istenecektir.

Ve son olarak Mega.co.nz bulut depolama hizmetinde barındıracağınız tüm dosyalar şifrelenecektir - Bunu yukarıda belirtmiştim. Bir yandan, bu harika, ancak diğer yandan, buluttayken içeriklerini görsel olarak görüntüleyemeyecek, ses ve video dosyalarını oynatamayacak veya dinleyemeyeceksiniz. Yani bu dosyaları kullanabilmek için onları bir bilgisayara veya mobil cihaza taşımanız gerekecek. İndirilen tüm dosyaları tamamen silmek için onları çöp kutusuna taşımanız ve ardından onu da boşaltmanız gerekir.

Biraz skandal yaratan MEGA hizmetinin piyasaya sürülmesinden sonra, güvenliğiyle ilgili konuşmalar biraz köpürdü ve sessizleşti. Bugüne kadar hizmet kendi hayatını yaşıyor ve kimse onu kırmadı bile. Nedense, MEGA'nın övündüğü “Kullanıcı Kontrollü Şifreleme” (UCE veya Kullanıcı Kontrollü Şifreleme) terimi tüm konuşmalardan kaçırıldı. "Kayıp" derken, istemci tarafında JavaScript'te çalışan bir şifreleme motorunun bize sunduğu tüm olasılıkları ele almadığımızı kastediyorum.

Tabii ki, MEGA hizmetinin kendisi bununla yalnızca şifreleme anahtarlarının sunucuda depolanmadığı, tüm onlara kriptografi tarayıcı bağlamında gerçekleştirilir. Aynı zamanda, hizmetin başlatılmasından sonra, kararsız kriptografik algoritmalar kullandığı ve genel olarak her şeyin kötü olduğu ve hepimizin öleceği ve FSB'nin dosyalarımızı okuyacağı konusunda çok fazla konuşma yapıldı. Bu, "UCE" kavramını genişletmemi ve hizmetin bazı güvenlik mekanizmalarını değiştirmek veya tamamlamak için kriptografiyi gerçekten kontrolüm altına almamı sağladı.

Bu makalede, iki megabaytlık MEGA JavaScript kodunda devam eden sihri kısmen parçalayacağım ve endişelenmeyi bırakmak ve kriptografiyi sevmek için bazı yöntemleri nasıl geçersiz kılabileceğinizi göstereceğim. Sonuç olarak, iki faktörlü kimlik doğrulama ve kritik bilgilerin donanım tabanlı şifrelemesi ile bir bulut dosya depolama hizmeti alacağız.

MEGA, UCE ve hepsi bir arada

Öyleyse, hizmetin istemci kısmının inşa edildiği teknolojilere, yeni kullanıcıların nasıl kaydedildiğine, kayıtlı kullanıcıların kimliklerinin doğrulandığına, şifrelerin değiştirildiğine ve dosyaların yüklendiği / indirildiğine bakarak başlayalım.

JavaScript

Bildiğiniz gibi, hizmetin tüm istemci tarafı JavaScript'e dayanmaktadır; ana sayfa kodu, tarayıcı tarafından yüklenen tüm komut dosyaları ve sayfalar için SHA-256 sağlama toplamlarını içerir. İndirmenin kendisi şu şekilde gerçekleşir: sağlama toplamları tüm dosyalar için kontrol edilir, ardından tarayıcıya verilen tek bir BLOB'da birleştirilir. js dosyalarının kaynak kodu farklı kişiler tarafından yazıldığını ve bazen kopyala-yapıştır sonuçları, anlamsız koşullar ve sadece garip değişkenler gibi komik inciler olduğunu gösteriyor.

Sitenin kaynak kodunu inceleme sürecinde, oldukça aktif bir şekilde güncellendiğini, geliştiricilerin küçük hataları düzelttiğini ve önceden yazılmış kodu optimize ettiğini fark ettim, bu iyi haber. Kodun kendisi çok basit bir şekilde ve prototip şeklinde aşırı hile yapılmadan yazılmıştır: site üç yüz global değişken ve 8000'den fazla fonksiyon ile yönetilmektedir. Sitenin mimarisini anlamak ve kodunu değiştirmek çok basitti.

Üçüncü taraf çerçevelerden MEGA, jQuery (şimdi onsuz hiçbir yerde), Ext JS ve SJCL kullanır. İkincisi, AES şifrelemeli bir şifreleme çekirdeği uygular. SJCL ayrıca, anahtarları ve diğer bayt dizilerini depolamak için ilginç bir biçim sağlar: normal bir dizide yalnızca bayt çalıştırmak yerine, bunlar a32 adı verilen bir biçime "sıkıştırılır". Özü, herhangi bir bayt dizisinin içeriğinin 32 bitlik sayılarla paketlenmesi ve daha küçük uzunlukta bir diziye yazılmasıdır. Yani, dizinin her 4 baytı bir banal int'ye dönüştürülür. Site kodu, doğaçlama bir kümede (a32 dizisi, dize, base64 dizesi) her türlü dönüşümü gerçekleştiren işlevleri içerir.

Anahtar bilgi

Kayıt ve kimlik doğrulama süreçlerinin açıklamasına geçmeden önce, şifrelenecek bilgileri göz önünde bulundurmaya değer, yani:
  • Hesap ana anahtarı Kullanıcı kaydı sırasında rastgele oluşturulan ve 128 bit uzunluğunda olan . Ve prensipte simetrik şifreleme için kullanılan tüm anahtarların uzunluğu 128 bittir.
  • RSA özel anahtarı: Fare hareketlerine ve klavye girişine göre kayıt sırasında oluşturulur. Bu yazıda, indirilen dosyaları paylaşmak için kullanıldığından asimetrik şifrelemeye odaklanmayacağım ve görevim kullanıcı verilerini doğrulama ve şifreleme sürecini değiştirmekti.
  • Bireysel dosya anahtarları ve dosyaların kendileri servise yüklendi. Anahtarlar, bir dosya yüklendiğinde rastgele oluşturulur, bu anahtarın kendisi dosya verilerini şifrelemek için kullanılır ve dosyanın bireysel anahtarına ve sağlama toplamına dayalı olarak oluşturulan anahtar, öznitelikleri şifrelemek için kullanılır.

koda daha yakın

Şimdi kayıt ve kimlik doğrulama işlemlerini sökmeyi öneriyorum, ana anahtarın nasıl oluşturulduğuna ve nasıl şifrelendiğine bakın.
İşte bu süreçleri bir kağıt üzerinde anlatmaya çalıştım ve çılgınlığın tüm özünü anlamanız için bu fotoğrafı bile çektim:

yeni kullanıcı kaydı

Kayıt işleminin kendisi oldukça kafa karıştırıcıdır, kullanıcı anketi doldurduktan sonra çok sayıda işlev çağrılır, ancak biz api_createuser işleviyle ilgileniyoruz:

// yeni bir kullanıcı ve onun ana anahtarını oluştur işlevi api_createuser(ctx, davet kodu, davetadı, uh) ( var i; var ssc = Dizi(4); // oturum kendi kendine sorgulama, parolayı doğrulamak için kullanılacak var req, res; if (!ctx.passwordkey) ( ctx.passwordkey = Array(4); for (i = 4; i--;) ctx.passwordkey[i] = rand(0x100000000); ) if (!u_k) api_create_u_k(); // (i = 4; i--;) ssc[i] = rand(0x100000000); için rastgele bir ana anahtar u_k üret + u_k + " passwordkey: " + ctx.passwordkey); // ana anahtarı mevcut şifre ile şifreleyin ve sunucuya gönderin (alan k) // ts alanı, ssc'nin şifrelenmiş değeri ile birleştirilmesidir req = ( a: "yukarı" , k: a32_to_base64(encrypt_key(yeni sjcl.cipher.aes(ctx.passwordkey), u_k)), ts: base64urlencode(a32_to_str(ssc) + a32_to_str(encrypt_key(yeni sjcl.cipher.aes(u_k)) , ssc))) ); if (davet kodu) ( req.uh = uh; req .ic = davet kodu; istek.name = davetadı; ) if (d) console.log("Anahtarı Saklama: " + req.k); api_req(, ctx); )
Bu fonksiyonda, aşağıdaki şeylerle ilgileniyoruz:

  • u_k, genel bir değişken olan ana anahtarın kendisidir. api_create_uk işlevi tarafından oluşturulan 4x 32 bitlik sayı dizisi
  • ssc, ana anahtarla şifrelenmiş, genel değeriyle birleştirilmiş ve sunucuya gönderilen rastgele bir dizidir. Daha sonra, kimlik doğrulama sırasında ana anahtarın doğruluğunu kontrol etmek için kullanılacaktır.
  • sjcl, AES'yi uygulayan bir şifreleme kitaplığıdır
  • Rand() - RC4'e dayalı sözde rasgele sayı üretecinin yerel uygulaması
  • encrypt_key(), hizmetin simetrik şifrelemesinin temel taşı işlevidir. Anahtarla başlatılmış bir sjcl nesnesini ve şifrelenecek bir diziyi kabul eder. İşlev kodu aşağıdadır ve umarım açıklayıcıdır.
// şifreleme/şifre çözme 4 veya 8 elemanlı 32 bit tamsayı dizi işlevi encrypt_key(şifre, a) ( if (a.length == 4) cipher.encrypt(a); var x = ; for (var i = 0 ben< a.length; i += 4) x = x.concat(cipher.encrypt(, a, a, a])); return x; }
Sonuç olarak, kayıttan sonra sunucuya aşağıdakiler gönderilir:
  • Hesap parolasından türetilen bir anahtarla şifrelenmiş ana anahtar
  • ssc||encrypt_AES-128(u_k, ssc) gibi bir dize

Kullanıcı Girişi

Artık sorunsuz bir şekilde kimlik doğrulama işlemine geçebilirsiniz. Kısaca şöyle yapılır:
  1. Kullanıcı kullanıcı adını/şifresini girer
  2. Kimlik doğrulamanın ilk aşaması geçilirse, şifrelenmiş ana anahtar ve kayıt sırasında oluşturulan kimlik doğrulama sırası (ssc) sunucudan gelir.
  3. Ana anahtarın şifresi, kullanıcı tarafından girilen parola kullanılarak çözülür.
  4. Ana anahtarda, kimlik doğrulama dizisinin şifresi çözülür ve genel değeriyle karşılaştırılır - böylece ana anahtarın ve parolanın doğruluğu kontrol edilir.
api_getsid2 geri çağırma işlevi, yukarıdakilerin hepsinden sorumludur:

// kullanıcı api_getsid2(res, ctx) işlevinde oturum açtıktan sonra ana anahtarın şifresini çöz ( var t, k; var r = false; if (typeof res == "object") ( // sjcl-aes'i mevcut hesapla başlat password var aes = new sjcl.cipher.aes(ctx.passwordkey); // sunucu yanıtında bir ana anahtar aldıysak... if (typeof res.k == "string") ( k = base64_to_a32(res. k); if (k.length == 4) ( // ... o zaman şifresini çöz k = decrypt_key(aes, k); // ve aes = new sjcl.cipher ana anahtarını kullanarak sjcl-aes'i yeniden başlat. aes( k); // kayıt işleminden ssc aldıysak if (typeof res.tsid == "string") ( t = base64urldecode(res.tsid); // stringin ilk yarısını şifrele ve sunucudan gelen değer // eşleşirlerse - bu, tüm görünümlerin ve parolaların kabul edildiği ve kullanıcının girmesine izin verebileceğiniz anlamına gelir if (a32_to_str(encrypt_key(aes, str_to_a32(t.substr(0, 16)))) == t. substr(-16)) r = ; ) // RSA çiftinin özel anahtarı aşağıda ayrıştırılmıştır, bununla ilgilenmiyoruz if (typeof res.csid == "s) tring") ( var t = mpi2b(base64urldecode(res.csid)); var privk = a32_to_str(decrypt_key(aes, base64_to_a32(res.privk))); var rsa_privk = Dizi(4); // için özel anahtarı ayrıştır (var i = 0; i< 4; i++) { var l = ((privk.charCodeAt(0) * 256 + privk.charCodeAt(1) + 7) >> 3) + 2; rsa_privk[i] = mpi2b(privk.substr(0, l)); if (typeof rsa_privk[i] == "sayı") break; privk = privk.substr(l); ) // formatı kontrol et if (i == 4 && privk.length)< 16) { // TODO: check remaining padding for added early wrong password detection likelihood r = ; } } } } } ctx.result(ctx, r); }
Kayıt/kimlik doğrulama için bir bonus olarak, şifre değiştirme sürecine bakabilirsiniz.

// kullanıcı parolasını değiştir işlev changepw(currentpw, newpw, ctx) ( var pw_aes = new sjcl.cipher.aes(prepare_key_pw(newpw)); api_req([( a: "up", currk: a32_to_base64(encrypt_key(new sjcl. cipher.aes(prepare_key_pw(currentpw)), u_k)), k: a32_to_base64(encrypt_key(pw_aes, u_k)), uh: stringhash(u_attr["email"].toLowerCase(), pw_aes) ], ctx);
Bu işlevin kodu kendisi için konuşur: ana anahtarı eski ve yeni şifrelerden elde edilen iki anahtarla şifreliyoruz ve ardından bu değerleri sunucuya gönderiyoruz. Mevcut şifre eşleşirse, yenisiyle değiştirilir. Burada, önceki tüm işlemlerde örtük olarak bulunan hazırla_key_pw işlevine daha fazla dikkat etmek istedim. Görevi, dize parolasını bir a32 dizisine dönüştürmek ve ardından anahtar türetme işlemini aşağıdaki gibi gerçekleştirmektir:

// kullanıcı tarafından sağlanan parola dizisi işlevini dönüştür hazırla_anahtar(a) ( var i, j, r; var aes = ; var pkey = ; for (j = 0; j)< a.length; j += 4) { key = ; for (i = 0; i < 4; i++) if (i + j < a.length) key[i] = a; aes.push(new sjcl.cipher.aes(key)); } for (r = 65536; r--;) for (j = 0; j < aes.length; j++) pkey = aes[j].encrypt(pkey); return pkey; }
Bu özellik bir homebrew algoritmasına dayandığı için birçok eleştiriye neden oldu. Makaleyi yazarken, hizmetin yaratıcıları kodunu biraz değiştirmeyi başardılar, ancak burada önemli bir değişiklik fark etmedim. Özü, rastgele birinden ayırt edilemeyen bir anahtar elde etmek için iletilen parolanın sabit bir anahtarla 65536 kez şifrelenmesidir. Hizmetin yaratıcılarının neden mevcut algoritmaları kullanmadığı (örneğin, PBKDF2) bir sır olarak kalıyor.

Dosyaları İndirme ve Şifreleme

Kısaca, tüm süreç aşağıdaki gibi temsil edilebilir:

Sizi uyarıyorum, bu resmi uzun süre araştırmak beyin için tehlikelidir, bu yüzden aşağıda size her şeyin nasıl olduğunu anlatacağım.

Daha önce de söylediğim gibi, her dosya için yükleme yaparken 6 adet 32 ​​bitlik rastgele bir anahtar dizisi oluşturulur. Bu dizinin ilk dört öğesi dosyanın içeriğini şifrelemek için kullanılır ve son ikisi, dosyanın sağlama toplamını hesaplamak için kullanılan sayacın ilk değerleri olarak kullanılır. Bu dizi ul_key global değişkeninde saklanır. İçeriği, JSON seri hale getirilmiş ul_KeyNonce dizesine yazılır.

Şifre çözmenin kendisi Web Çalışanı (tarayıcı bu teknolojiyi destekliyorsa) veya sadece ana sayfa kodunun içinde gerçekleşir. Bir dosya gönderilmeye hazır olduğunda, ul_key ve dosyanın sağlama toplamı temelinde özniteliklerini şifrelemek için yeni bir anahtar, filekey oluşturulur (şu anda, öznitelikler yalnızca dosya adı anlamına gelir). Bu anahtar daha sonra ana anahtarla şifrelenir ve dosya öznitelikleri ile birlikte sunucuya gönderilir. Tüm bu eylemlerden initupload3 ve api_completeupload2 işlevleri sorumludur. filekey anahtarının oluşturulması ul_chunkcomplete işlevinde gerçekleşir, aşağıda bir kısmını vereceğim.

// bir dosya yüklemeye başla: özel anahtarını oluşturma ve şifreleme mekanizmasını başlatma işlevi initupload3() ( // ... cut =) // rastgele bir özel dosya anahtarı oluşturma // ul_key sayfa kodunda kullanılır, // ul_keyNonce Web Çalışanına iletilir ve orada // dosyayı şifrelemek ve sağlama toplamını hesaplamak için kullanılır ul_key = Array(6); (i = 6; i--;) için ul_key[i] = rand(0x100000000); ul_keyNonce = JSON.stringify(ul_key); ul_macs = ; // ... sonraki adım indirme kuyruğunu işliyor, bu ilgi çekici değil... // ul_key'e dayalı bir dosya için sjcl-aes başlatılıyor ul_aes = new sjcl.cipher.aes(); // ... // dosya yükleme işlemini başlat: // diskten oku, şifrele ve onUploadStart(ul_queue_num); ul_dispatch_chain(); ) // dosya özniteliklerini şifrelemek için bir anahtar oluşturma function ul_chunkcomplete(slot,pos,response) ( // ... var t = ; // ul_macs - işçi içinde elde edilen dosya sağlama toplamına sahip dizi"ve (ul_macs'de p) için t . push(p); // nedenini bilen biri varsa geçici bir diziyi doldurma ve sıralama - lütfen açıklayın t.sort(function(a,b) ( return parseInt(a)-parseInt(b) )); for (var i = 0; ben< t.length; i++) t[i] = ul_macs]; // внутри condenseMacs производится зашифрование // и "уплотнение" контрольной суммы файла в массив из 4х элементов var mac = condenseMacs(t,ul_key); ul_settimeout(-1); // на основе контрольной суммы и ключа файла создается ключ для шифрования атрибутов // он же в зашифрованном виде позже будет отправлен на сервер var filekey = ; // ... } // завершение загрузки файла: зашифрование атрибутов и ключа файла и отправка их на сервер function api_completeupload2(ctx, ut) { var p; if (ctx.path && ctx.path != ctx.n && (p = ctx.path.indexOf("/")) >0) ( var pc = ctx.path.substr(0, p); ctx.path = ctx.path.substr(p + 1); fm_requestfolderid(ut, pc, ctx); ) else ( // dosya adını şununla şifreleyin ul_key ve sağlama toplamından türetilen anahtar // ctx.k == filekey a = ( n: ctx.n ); if (d) console.log(ctx.k); var ea = enc_attr(a, ctx.k); if (d) console.log(ea); // ana anahtarda şifrelenmiş öznitelikleri ve dosya anahtarı var req = ( a: "p", t: ut, n: [( h: ctx.t, t: 0) , a: ab_to_base64(ea), // öznitelikler k: a32_to_base64(encrypt_key(u_k_aes, ctx.k)), // == AES_encrypt(u_k, filekey) fa: ctx.fa )] ); if (ut) ( / / bir hedef sağlandı: tüm ilgili paylaşımlara şifrele var sn = fm_getsharenodes(ut); if (sn.length) ( req.cr = crypto_makecr(, sn, false); req.cr = ctx.t; ) ) api_req (, ctx.ctx); ))

Dosyaları indirme ve şifresini çözme

Açıkçası, bu işlemler şifrelenen dosyanın tam tersi olmalıdır. İlgilenebilecek tek şey, sunucudan gelen şifreli filekey değerinden ul_key anahtarının değerini almaktır.

Dosyayı indirirken, tarayıcı bağlamı, şifresi çözülen dosya anahtarlarını depolayan bir nesneyi zaten içerir. Bu nedenle, öncelikle kullanıcı kimlik doğrulamasından hemen sonra gerçekleşen, yani dosya yöneticisinin yüklenmesi sürecini dikkate almak mantıklıdır. Kullanıcının hizmete girmesine izin verildikten sonra, doğal olarak dosyalarına erişmek ister (onların zaten orada olduğunu varsayarak). Bunu yapmak için önce dosya anahtarlarının ve ardından özniteliklerinin şifresini çözmemiz gerekiyor. Bu iş, loadfm_callback ve process_f_f ile ilgilendiğimiz başka bir fonksiyon grubu tarafından gerçekleştirilir.

Kısaca, dosya özniteliklerini elde etme süreci aşağıdaki algoritma ile açıklanabilir:

  1. Dosya yöneticisinin (loadfm_callback) yüklenmesini bekleyin, yüklenen tüm dosyaların açıklamasıyla birlikte JSON'un nereden alınacağı
  2. Dosyalar hakkında bilgi içeren bir dizi koymak için bir dizi farray oluşturun
  3. Process_f_f işlevini her dosya için (yinelemeli olarak) çalıştırın
  4. Bir anahtarı olan her dosya için, o anahtarın ve niteliklerin (crypto_processkey işlevi) şifresini çözün ve bunları dosya bilgileriyle birlikte bir diziye geri saklayın
  5. Bundan sonra, şifresi çözülen değerleri FileStore değişkenine kaydedin (process_f_f'de özyinelemenin sonu)
Aşağıda bu algoritmayı gösteren koddan alıntılar vereceğim.

// dosya yöneticisi geri çağırma işlevini yükle loadfm_callback(json, res) ( // ... // JSON'u dosya bilgileriyle işle json = json; if (d) console.log(json); if (d) console.log (json) ); if (json.u) process_u(json.u, false); if (json.ok) process_ok(json.ok); if (json.s) ( for (json.s'de i) ( if ( u_sharekeys. h]) ( shareData.push(( id: json.s[i].h + "_" + json.s[i].u, kullanıcı kimliği: json.s[i].u, klasör kimliği: json.s[ i].h, haklar: json.s[i].r, tarih: json.s[i].ts )); sharednodes.h] = true; )) ) // ... başka bir şey değil. .. / / başka bir global diziye dosyalar hakkında bilgi ekleme farray = new Object; farray.f = json.f; // işlemeye başlarken, yukarıda geri çağrı bildirildi // bu fonksiyonda ve basitçe process_f(fi, false , düzenini değiştirir, callback); fi++; ) // anahtarların ve dosya özniteliklerinin şifresinin çözüldüğü özyinelemeli işlev // process_f işlevinden çağrılır process_f_f(fid) ( // özyineleme sonlandırma koşulu - fa dizisindeki tüm dosyaları işledik rray if (!farray.f.i]) ( if (farray.ap) FileStore.suspendEvents(); // FileStore'a veri yaz FileStore.loadData(farray.mdata, true); if (farray.ap) FileStore.resumeEvents(); if (d) console.log("reqmissingkeys'i çağırın:"); kripto_reqmissingkeys(); if (farray.callback) farray.callback.fn(farray.callback); yanlış döndür; ) var f = farray.f.i]; f.attrs = f.a; if (f.sk) u_sharekeys = crypto_process_sharekey(f.h, f.sk); // dosya türle eşleşiyorsa ve bir anahtarı varsa, onu işleyin if ((f.t !== 2) && (f.t !== 3) && (f.t !== 4) && (f.k)) ( crypto_processkey(u_handle) , u_k_aes) , f); // bu fonksiyonun açıklaması aşağıda u_nodekeys = f.key; if ((typeof f.name !== "undefined") && (f.p == InboxID)) InboxCount++; ) else ( if (f.a) ) ( if ( !missingkeys) ( eksikkeys = true; yenimissingkeys = true; ) ) f.k = ""; f.name = ""; ) if (f.t == 2) RootID = f.h; else if (f.t == 3) Gelen KutusuKimliği = f.h; else if (f.t == 4) TrashbinID = f.h; else if ((f.t< 2) || (f.t == 5)) { // тут идет обработка расшаренных файлов } else { // подготовка массива для записи в FileStore farray.mdata.push({ id: f.h.replace(/[^a-z^A-Z^0-9^_^-]/g, ""), name: f.name, size: f.s, type: filetype(f.name, f.t), icon: fileicon(f.name, icontype), parentid: f.p, folder: f.t, owner: f.u, date: f.ts, attrs: f.attrs, key: f.key, r: f.r, su: f.su, fa: f.fa, }); if (f.p == TrashbinID) trashbinfull = true; if (((f.t) && (farray.ap)) || (f.p == InboxID)) refreshtree = true; } farray.i++; // проверка таймаута (видимо, чтобы загрузка файл-менеджера не выглядела слишком долгой) timeoutcount++; if (!(timeoutcount & 63)) { // если у нас больше 63 файлов - дальше грузим их асинхронно setTimeout("process_f_f(" + fid + ")", 1); timeoutcount2++; } // иначе - запускаем обработку следующего файла else process_f_f(fid); } // обработка ключа файла и его атрибутов function crypto_processkey(me, master_aes, file) { var id, key, k, n; if (!file.k) { if (!keycache) return; file.k = keycache; } id = me; // do I own the file? (user key is guaranteed to be first in .k) // ключ записан в виде ":/" var p = file.k.indexOf(id + ":"); // önce dosyanın paylaşılıp paylaşılmadığını kontrol et if (p) ( // uygun bir sharekey'im var mı? for (id in u_sharekeys) ) ( p = file.k.indexOf(id + ":"); if (p >= 0 && (!p || file.k.charAt(p - 1) == "/")) break; p = -1; ) ) // ve sonra if (p >= 0) ( keycache sil; // eğik çizgi - görünüşe göre topların bir işareti var pp = file.k.indexOf("/", p) ; eğer (s.< 0) pp = file.k.length; p += id.length + 1; key = file.k.substr(p, pp - p); // we have found a suitable key: decrypt! if (key.length < 46) { // short keys: AES k = base64_to_a32(key); // check for permitted key lengths (4 == folder, 8 == file) if (k.length == 4 || k.length == 8) { // ключ расшифровывается либо на мастер-ключе, либо на общем ключе шары k = decrypt_key(id == me ? master_aes: new sjcl.cipher.aes(u_sharekeys), k); } else { if (d) console.log("Received invalid key length (" + k.length + "): " + file.h); return; } } else { // long keys: RSA if (u_privk) { var t = mpi2b(base64urldecode(key)); if (t) k = str_to_a32(crypto_rsadecrypt(t, u_privk).substr(0, file.t ? 16: 32)); else { if (d) console.log("Corrupt key for node " + file.h); return; } } else { if (d) console.log("Received RSA key, but have no public key published: " + file.h); return; } } // декодируем атрибуты файла var ab = base64_to_ab(file.a); // и расшифровываем их с помощью только что полученного ключа var o = dec_attr(ab, k); if (typeof o == "object") { if (typeof o.n == "string") { if (file.h) { u_nodekeys = k; if (key.length >= 46) rsa2aes = a32_to_str(encrypt_key(u_k_aes, k)); ) // anahtarın ve özniteliklerin şifresini doğru çözdüysek, bunları dosya nesne dosyasına kaydedin.key = k; dosya.name = o.n; ) ) ) else ( if (d) console.log("Uygun bir anahtar alınmadı: " + file.h); if (!missingkeys) ( newmissingkeys = true; eksik anahtarlar = true; ) keycache = file.k; ) )
Bundan sonra, tarayıcı bağlamından orijinal ul_key değerini şu şekilde alabiliriz: dl_keyNonce = JSON.stringify();
Bu dönüşüm startdownload işlevinde gerçekleşir. ul_chunkcomplete işlevinden dl_key == filekey değerini dikkate alırsak ve basit modulo ekleme işlemleri gerçekleştirirsek, dl_keyNonce değişkeninin dosya yüklendiğinde oluşturulan ul_key değerini depolayacağını fark edeceğiz. Bunun bir örneği, dosya yükleme bölümünün başındaki fotoğrafta panonun sol alt köşesinde görülebilir.

Kriptografik işlemlerin "aşırı yüklenmesi"

Yukarıda açıklanan dosya ve anahtarları koruma ilkelerinin çok güvenli olmasına rağmen, bazıları hala hizmetin sağladığı algoritmaların uygulanmasına bağlı olmamızdan hoşlanmayabilir. Bu durumda, hizmetin bazı işlevlerini geçersiz kılacak ve bunlara ek şifreleme uygulayacak kendi tarayıcı uzantımızı geliştirebiliriz. Yani, GOST 28147-89 algoritmasına göre kurtarılamayan bir anahtar üzerinde donanım şifrelemesi kullanarak anahtar bilgilerinin (ana anahtar ve dosya anahtarları) korunmasını uygulamaya karar verdim. Buna bir bonus, hizmete iki faktörlü kimlik doğrulamanın dahil edilmesi olacaktır.
Bu nedenle, bu kullanım durumunu düşünün:
  • Kullanıcı hizmete kaydolur
  • Sonra uzantıyı yükler
  • Onun yardımıyla, ana anahtarın donanımsal şifrelemesi, token'dan alınamayan bir anahtar üzerinde gerçekleştirilir.
  • Bu şekilde şifrelenen ana anahtar sunucuya yüklenir.
Bundan sonra, jeton ve PIN kodu olmadan ana anahtarın değerini elde etmek imkansız olacaktır. Bu şunları verecektir:
  1. Hizmette iki faktörlü kimlik doğrulama (şifresi doğru bir şekilde çözülen ana anahtar olmadan, api_getsid2 işlevi başarısız olur)
  2. Bir jeton olmadan, mevcut hesap şifresini değiştirmek de imkansız olacaktır.
Sonraki adım, dosya şifreleme anahtarı belirtecini (aka ul_key) ve henüz sunucuda depolanan dosya öznitelik anahtarını (filekey) kullanarak şifrelemektir. Böylece, her dosyanın, bizim tarafımızdan api_completeupload2 işlevinden şifrelenen dosya anahtarının gideceği sunucuya asla ulaşmayacak bir anahtarla şifreleneceğini elde ederiz. Dosya öznitelikleri filekey'in genel değeri üzerinde şifrelenecektir. Daha fazla netlik için, bir dosya indirme işlemini gösteren aşağıdaki diyagramı çizdim:

Burada çok meşakkatli bir yöntem uyguladığımı belirtmek isterim. Bu durumda saldırganın sunucudan gelen dosya anahtarını ele geçirip kullanıcının ana anahtarını bilse bile dosyanın şifresini çözememesi bizim için önemlidir. Bu nedenle, burada hizmet mimarisinin özellikleri üzerinde oynayabilir ve token üzerindeki ul_key (veya dl_key) anahtar değerinin dosyaları şifrelemek (de) için şifrelenmesi sonucunda elde edilen ul_keyNonce (aka dl_keyNonce) anahtar değerini kullanabilirsiniz.

Bu yazıların yazılmasından itibaren ürünümüze GOST 28147-89 algoritmasına göre donanımsal şifreleme imkanı eklenmiştir. Eklentinin GOST 28147-89 algoritmasına göre donanım şifreleme işlevine sahip beta sürümü indirilebilir. Eklentinin bu sürümü henüz tam olarak test edilmedi, bu yüzden kişisel bir mesajla bildirmenizi rica ettiğim hatalar içerebileceği konusunda sizi uyarıyorum.
Eklenti arayüzünde, simetrik şifreleme, aşağıdaki sözdizimine sahip şifreleme işlevi tarafından uygulanır:
encrypt(deviceId, keyLabel, data, resultCallback, errorCallback) → (string)
İşlev girdi olarak alır:

  • Cihaz kimliği, numara
  • Şifreleme için anahtar etiketi, numarası (eğer böyle bir anahtar yoksa üretilecektir)
  • Şifrelenecek veriler, dize ("aa:bb:cc:dd" biçiminde bir bayt dizisi içeren bir dize)
  • Bir şifreleme işleminin başarısı ve başarısızlığı için geri arama işlevleri
Şifre çözme, şifre çözme işlevi kullanılarak aynı şekilde yapılır.
Verileri (de)şifrelemek için hangi anahtarın kullanılacağını belirlediğinden, anahtar etiketine özel dikkat gösterilmelidir. Etiket rastgele bir dizedir ve esas olarak anahtarı kolayca tanımlamak için kullanılır. Bu durumda, iki anahtar çifti kullanırım: biri ana anahtarı (de)şifrelemek için, ikincisi tek tek dosya anahtarlarını şifrelemek için. Ana anahtarın şifrelendiği anahtar, kullanıcının parolasına eşit bir etikete sahiptir (şimdi e-posta||parola dizesinden bir karma kullanma fikri aklıma geldi, bunu yakın gelecekte düzelteceğim). Yüklenen dosyaların anahtarlarını şifrelemek için, ana anahtarın dize temsiline eşit bir etikete sahip bir anahtar kullanılır (burada, ana anahtarın karmasını da kullanmalısınız).

Doğrudan geliştirme

Kaynak kodum hakkında hemen bir not almak istiyorum: aslında, yukarıda açıklanan işlevleri yerine getirmesine rağmen, alfa sürümündedir. Yeniden çalışmamın hizmetin geri kalanıyla ne kadar uyumlu olduğunu kontrol etmedim, bu yüzden tüm kaynakları github'a gönderdim ve bu sistemi sonlandırmak için herhangi bir yardımdan memnuniyet duyacağım. Bu nedenle, makaleyi büyük listelerle daha fazla tıkamayacağım, ancak yalnızca uzantının genel şemasını anlatacağım.

Bitmiş uzantı indirilebilir. Üç tarayıcı (Chrome, Firefox ve IE) için uzantılar sağlayan Crossrider hizmeti kullanılarak geliştirilmiştir, ancak çalışmalarını Chrome veya Firefox'ta kontrol etmek daha iyidir ve ilk başta çok daha kararlı çalışır.

Uzantı kodu son derece basittir: hizmet sayfasında olup olmadığımızı kontrol eder ve eğer öyleyse, sadece ek komut dosyaları yükler. Bu komut dosyaları, birkaç iletişim kutusu ekleyerek sayfa kodunu değiştirir ve aşağıdaki hizmet işlevlerini geçersiz kılar:

  • changepw: şifreyi değiştirmekten sorumlu
  • api_getsid2: oturum açma geri aramalarından biri
  • api_completeupload2: dosya yüklemeyi tamamlamak için geri arama
  • loadfm_callback: dosya yöneticisi geri aramayı yükler
  • processpacket: yeni yüklenen dosyanın özniteliklerinin şifresini çözen başka bir geri arama
  • ayrıştırma: ek diyaloglar çizmekten sorumlu
  • dologin: kimlik doğrulama seçeneklerini genişletir
  • initupload3: dosya şifreleme anahtarının oluşturulmasından sorumludur
  • startdownload: dosya anahtarını ters ayrıştırma ve indirmeyi başlatma
Bir kez daha, uzantıyı çalışan bir hesaba sürüklememeniz gerektiği konusunda sizi uyarmak istiyorum (burada herhangi biri bu hizmeti kullanıyorsa), ancak bir test başlatmak daha iyidir. Uzantıyı yükledikten sonra kullanmak için yapmanız gerekenler:
  1. Yeni başlayanlar için, bir Rutoken EDS (veya Rutoken Web) edinmek ve bir tarayıcı eklentisi yüklemek iyi bir fikirdir.
  2. Uzantısı yükleyin
  3. Uzantı devre dışıyken hizmette oturum açın
  4. Tarayıcı uzantısını etkinleştir
  5. Hesap sayfasına giriş yapın
  6. "Bağlantı belirteci" düğmesini tıklayın
  7. Mevcut şifreyi girin ve bu işlemi gerçekleştirin
Bir uzantı yerine aşağıdaki yer işaretini kullanabilirsiniz (Chrome, Safari, Firefox'ta test edilmiştir): javascript:(function()(if(document.getElementById("cryptorutokenjs"))(alert("Eklenti zaten yüklü") ;return)function loadRemoteScript(url )(var script=document.createElement("script");script.type="text/javascript";script.src=url;document.head.appendChild(script))function loadRemoteStyle(url) )(var style=document. createElement("link");style.rel="stylesheet";style.type="text/css";style.href=url;document.head.appendChild(style))loadRemoteStyle(" https://mega-crypto .googlecode.com/git/mega.css");loadRemoteScript("https://mega-crypto.googlecode.com/git/util.js");loadRemoteScript("https:// mega-crypto.googlecode.com /git/rutoken-extra.js");loadRemoteScript("https://mega-crypto.googlecode.com/git/rutoken-crypto.js");loadRemoteScript("https:// mega-crypto.googlecode.com /git/mega.js")))());

İşin gösterilmesi

Öncelikle kreasyonumuzu siteye bağlayalım. Bunun için:

Ardından hizmetten çıkış yapabilir ve iki faktörlü kimlik doğrulamayı kullanarak tekrar giriş yapmayı deneyebilirsiniz:

Kimlik doğrulama şu şekilde gerçekleşir:

  1. Sunucudaki oturum açma-şifre çiftini kontrol etme
  2. Oturum açma ve parola doğruysa, şifreli ana anahtar sunucudan gelir
  3. Eklenti, belirteç için bir PIN kodu ister
  4. PIN doğru girilirse, ana anahtarın şifresi, belirteçten gelen anahtarda çözülür.

Sonuç yerine

Buraya sadece "devam edecek ..." yazmak istiyorum, çünkü bir uzantı oluşturmanın ayrıntılarını ve çoğu durumda senkronize çağrıları kullanan bir hizmete asenkron şifreleme işlevlerini vidalamanın ilginçliğini ele almadım. Bu makalenin sonunda, bir kez daha istemci tarafı kriptografisi uygulama fikrine dönmek istiyorum.
İstemci tarafında ek şifreleme işlevleri uygulama yaklaşımı, sunucusunda ne depolanacağıyla ilgilenmeyen herhangi bir web hizmetine uygulanabilir: dosya depolama, posta veya basit bir sohbet olabilir. Örneğin, CMS formatında mesaj şifrelemesini ve VKO GOST R 34.10-2001 algoritmasına göre anahtar değişim mekanizmalarını kullanarak herhangi bir posta hizmetine dayalı güvenli posta uygulayabilirsiniz.
İlginiz için teşekkür ederim, sorularınızı ve yorumlarınızı bekliyorum.javascript Etiket ekle