Excel, her ikisi de "parola" olarak adlandırılan iki şey sunar ve bunlardan yalnızca biri şifrelemedir. Açılış parolası gerçek bir şifreyi kilitler: Bu parola olmadan dosya hiçbir şekilde okunamaz. Çalışma sayfası ve çalışma kitabı koruma parolaları ise böyle bir şey yapmaz. Bunlar, işbirlikçi bir düzenleyicinin uymayı kabul ettiği bir bayrak ayarlar ve bu bayraktan başka hiçbir şey taşımayan bir çalışma kitabı, verilerin düz metin olarak yer aldığı düz okunabilir bir zip dosyasıdır. Yanlış olanı seçerseniz, Excel'de kilitli görünen ve herhangi bir metin düzenleyicide okunabilen bir maaş bordrosu gönderirsiniz
Kanıtı on saniye sürer. Korumalı bir .xlsx dosyasını .zip olarak yeniden adlandırın, herhangi bir arşiv aracında açın ve xl/worksheets/sheet1.xml dosyasına bakın. Hücre değerleri orada düz UTF-8 olarak bulunuyorsa, birisi bir hücreyi düzenlemeye çalıştığında Excel ne kadar çok parola istemi çıkarırsa çıkarsın dosya şifrelenmemiş demektir. Bu açık, sayfa korumasının gizlilik olduğunu varsayan ekiplerin içinde yıllarca varlığını sürdürür ve genellikle bir güvenlik incelemesinin tam olarak bu yeniden adlandırmayı çalıştırdığı gün gün yüzüne çıkar
HotXLS, yerel bir Delphi ve C++Builder elektronik tablo kütüphanesidir ve iki özelliği bu çizginin zıt taraflarında tutar. Çalışma sayfası ve çalışma kitabı koruması, kasıtlı olarak zayıf tutulmuş eski bir karma ile desteklenen düzenleme kısıtlamalarıdır. SaveAsEncrypted, parola dışında hiçbir şeyin açamayacağı AES şifreli bir paket üretir. Aşağıdaki bölümler bu çağrının ne yazdığını, etrafında tasarım yapmanız gereken asimetriyi (HotXLS şifreli dosyalar yazar ancak bunları geri okuyamaz) ve daha eski XLS yolunun nasıl farklılık gösterdiğini kapsamaktadır
Sayfa koruması neden şifreleme değildir?
Sayfalardaki Protect ve çalışma kitabındaki ProtectWorkbook yöntemleri, parolanın 4 haneli onaltılık (hex) bir karmasını saklar. Bu, hem OOXML hem de BIFF'in 1990'ların Excel'inden miras aldığı eski algoritmadır ve biçim belgeleri bunun kazara yapılan düzenlemeleri durdurmaktan daha fazlasını yaptığını asla iddia etmez. Paket sıradan okunabilir bir zip olarak kalır: Hücre verileri, formüller ve paylaşılan dizgelerin tümü düz metin XML biçimindedir. Varsayılan ayar durumu düzeltmek yerine daha da kötüleştirir. Her hücre Locked=True ile başlar, bu nedenle önce bir girdi aralığının kilidini açmadan Protect çağrısı yapmak, her değeri düz görünümde bırakırken tüm sayfayı düzenlemeye karşı dondurur
Bunların hiçbiri korumayı yararsız kılmaz. Kullanıcıları düzenlenebilir aralıklara yönlendirmek ve yazdırma için bir düzeni kararlı hale getirmek, çalışma sayfası koruması ve sayfa yapısı hakkındaki makalemizde ele alınan gerçek işlerdir. Ancak bunlar kullanılabilirlik işleridir. Gereksinim gizlilik olduğu anda, buna yanıt veren tek API SaveAsEncrypted'dir
SaveAsEncrypted gerçekte ne yazar?
Uygulama, [MS-OFFCRYPTO] bölüm 2.3.4'te belirtilen ECMA-376 Standart Şifrelemesini takip eder. Parola, bir AES-128 anahtarı türetmek için 50.000 SHA-1 yinelemesinden geçer. AES-128 ile ECB modunda şifrelenmiş bir doğrulayıcı blok, bir tüketicinin herhangi bir şeyi çözmeden önce parolayı onaylamasını sağlar ve ardından tüm çalışma kitabı paketi CBC modunda AES-128 ile şifrelenir. Diske düşen şey kesinlikle bir zip değildir. Bir arşiv aracının listelemesi için xl/ dizini içermeyen, EncryptionInfo, EncryptedPackage ve DataSpaces akışlarını tutan bir OLE bileşik dosyasıdır; bu nedenle yeniden adlandırma testi artık okunabilir hiçbir şey sunmaz. Excel 2007 ve sonrası bunu yalnızca parolayla açar ve mevcut LibreOffice de Standart Şifrelemeyi okur
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
rc: Integer;
begin
Book := TXLSXWorkbook.Create;
try
Sheet := Book.Sheets.Add('Payroll');
Sheet.Cells[1, 1].Value := 'Employee';
Sheet.Cells[1, 2].Value := 'Net pay';
Sheet.Cells[2, 1].Value := 'A. Garcia';
Sheet.Cells[2, 2].Value := 4815.16;
rc := Book.SaveAsEncrypted('payroll-2026-06.xlsx', PasswordFromVault);
if rc <> 1 then
raise Exception.CreateFmt('Encrypted save failed (rc=%d)', [rc]);
finally
Book.Free;
end;
end;
Parola değişkenine bir bağlantı dizesi (connection string) ile aynı özeni gösterin. Bunu son anda bir kasadan veya oluşturulmuş bir gizli servisten alın, asla günlüğe kaydetmeyin ve asla çalışma kitabının içine yazmayın. Geri dönüş kodu kontrolü isteğe bağlı bir tören değildir. Yarıda başarısız olan bir şifreli kaydetme teslimatı durdurmalıdır, çünkü çağıran kodun sunabileceği tek yedek şifrelenmemiş bir kopyadır ve bu kopya, bu özelliğin önlemek için var olduğu olayın tam kendisidir
Ayrıca neredeyse hiçbir maliyeti olmayan ve makine tarafından kontrol edilebilen bir kabul testi de vardır: Az önce yazdığınız dosyada CanReadEncrypted çağrısı yapın. Yalnızca çıktı gerçekten bir şifreleme kapsayıcısı olduğunda true döndürür, bu nedenle her şifreli kaydetmeden sonra bunu doğrulamak (assert), sessizce düz bir SaveAs'e geri dönen bir kod yolunu, haftalar sonra müşterinin gelen kutusunda değil, gerçekleştiği anda yakalar. Son söz, sürüm testi sırasında gerçek parolayla Excel'de manuel olarak açmaya aittir
Tasarım gereği salt yazılır: EXlsxEncryptionNotImplemented durumunun ele alınması
Süreç hattı mimarinizi şekillendirmesi gereken asimetri şudur: HotXLS kaydederken şifreler ancak açarken şifreyi çözmez. OpenEncrypted, gerçek bir şifrelenmiş pakete yönlendirildiğinde EXlsxEncryptionNotImplemented hatası fırlatır; düz bir çalışma kitabında ise doğrudan normal bir Open işlemine geçer. Eşlik eden inceleme yöntemi CanReadEncrypted, OLE şifreleme kapsayıcısını ucuza tespit eder, böylece kabul kodu istisnayı tetiklemeden bu tür dosyaları yönlendirebilir:
var
Book: TXLSXWorkbook;
begin
Book := TXLSXWorkbook.Create;
try
if Book.CanReadEncrypted(FileName) then
begin
// Şifreli kapsayıcı: HotXLS bunun şifresini çözemez.
Writeln(FileName + ': needs manual decryption in Excel first');
Exit;
end;
try
Book.OpenEncrypted(FileName, ''); // düz dosyalar doğrudan Open'a geçer
Writeln(FileName + ': opened, ' + IntToStr(Book.Sheets.Count) + ' sheet(s)');
except
on EXlsxEncryptionNotImplemented do
Writeln(FileName + ': encrypted - routed to manual queue');
end;
finally
Book.Free;
end;
end;
Bu asimetrinin net bir mimari okuması vardır: En son, teslimat sınırında şifreleyin. Düz metin halindeki asıl dosyayı güven sınırınızın içinde, bir veritabanında, bir belge deposunda veya erişim kontrollü bir paylaşımda tutun ve dosya sistemden ayrılmadan önceki son adım olarak şifrelenmiş kopyayı oluşturun. Yalnızca şifrelenmiş çıktıyı arşivleyen bir süreç hattı, kendisini kendi verilerinden mahrum bırakmıştır, çünkü aynı sistemin daha sonraki hiçbir aşaması bu dosyaları yeniden açamaz. Aşağı akıştaki bir HotXLS süreci çalışma kitabına tekrar ihtiyaç duyduğunda, ona teslimat yapıtını değil, düz metin halindeki asıl dosyayı verin
AES-128 Standart Şifreleme ve AES-256 uyumluluk çizgisi
Office dosya şifrelemesi iki nesilde gelir. HotXLS'in yazdığı Standart Şifreleme, SHA-1 anahtar türetimi ile AES-128 kullanır. Çevik (Agile) Şifreleme daha sonra geldi ve SHA-512 ve farklı, XML ile tanımlanmış bir anahtar kapsayıcısı ile AES-256'ya geçiş yaptı. Her ikisi de Excel'de şeffaf bir şekilde açılır ve AES-128, müşteriye taşınan bir dosyayı korumak için hesaplama açısından hala sağlamdır
Bir güvenlik anketi "beklemedeki dosyaların AES-256 ile şifrelenmesini" istediği gün aradaki fark akademik olmaktan çıkar. Parola ne kadar güçlü olursa olsun, Standart Şifreleme bu çizgiyi karşılamaz ve SaveAsEncrypted parametrelerinin hiçbiri yaydığı algoritmayı değiştirmez. Bu nedenle güvenlik belgelerinizde profili kesin olarak belirtin: AES-128, ECMA-376 Standart Şifreleme, 50.000 yinelemede SHA-1 anahtar türetimi. İncelemeden sağ çıkan bir iddia, bir denetim altında çöken iyimser bir iddiadan daha değerlidir
Eski XLS rotası: RC4 giden, RC4 ve XOR gelen
BIFF arayüzü tam tersi bir şekle sahiptir. Şifrelemesi daha eski ve zayıftır ancak gidiş-dönüş tamamlanmıştır: Yazdığını geri de okuyabilir. SaveAs öncesinde EncryptionPassword ayarlamak, BIFF FilePass mekanizması aracılığıyla RC4 şifreli bir .xls üretir ve parola parametreli Open; RC4, RC4 CryptoAPI ve eski XOR gizleme (obfuscation) olmak üzere her üç eski şemayı da okur:
var
Writer, Reader: IXLSWorkbook; // arayüz referansları: manuel Free yok
begin
Writer := TXLSWorkbook.Create;
Writer.Sheets.Add.Cells.Item[1, 1].Value := 'Confidential';
Writer.EncryptionPassword := 'S3cret!';
Writer.SaveAs('confidential.xls');
Reader := TXLSWorkbook.Create;
if Reader.Open('confidential.xls', 'S3cret!') > 0 then
Writeln(Reader.Sheets[1].Cells.Item[1, 1].Value); // Girişler 1 tabanlıdır
end;
RC4 modası geçmiş bir kriptografidir ve günümüzde önem taşıyan verileri korumak için asla kullanılmamalıdır; kalan tek değeri, hala .xls alışverişi yapan sistemlerle birlikte çalışabilirliktir. Ancak okuma tarafı, geçiş (migration) çalışmalarında değerini kanıtlar. Parola korumalı eski bir dosya, döngünün hiçbir yerinde Excel olmadan çalışan tek yönlü bir yükseltme olan Open(FileName, Password) ile açılır, OOXML modeline köprülenir ve AES yolu üzerinden yeniden güvence altına alınır. Yüksek hacimli şifreli teslimatlar için, sunucu toplu işleri için akışlı yazmalar hakkındaki makalemizdeki kaydetme tarafı verim notları, şifrelemeden önce gerçekleşen içerik oluşturma aşaması için geçerlidir
Şifreleme ve koruma rakip değildir
Bir nokta daha çözülmeye değer, çünkü bu sayfadaki uyarının tepesini "koruma değersizdir" olarak okuyan birisi çıktığı anda gündeme gelir. Değersiz değildir. Şifreleme ve koruma farklı sorulara yanıt verir ve temiz bir şekilde üst üste biner. Şifreleme, dosyayı kimin açabileceğine karar verir; koruma ise halihazırda içeride olan bir okuyucunun neleri değiştirebileceğine karar verir. Bir bordro teslimatı makul bir şekilde her ikisini de yapabilir: Paketi şifreleyin, böylece yalnızca parolanın sahibi görebilsin; ardından formül hücrelerini kilitleyin, böylece alıcı filtreleyip sıralayabilsin ancak hesaplamaları sessizce yeniden yazamasın. Hata asla koruma eklemek değildir. Hata, gereksinim gizlilik olduğunda varlığının şifreleme yerine geçmesine izin vermektir
Saklama (custody) tarafının güvenlik ağı yoktur ve bu tasarım gereğidir. 50.000 yinelemeli anahtar türetimi, tahmin etmeyi pahalı hale getirmek için vardır ve dosyanın içindeki hiçbir şey sırrı emanet (escrow) etmez. Kaybedilen bir parola, kaybedilen veri demektir. Bu parolaları, veritabanı kimlik bilgilerine uyguladığınız disiplinle oluşturun, teslim edin ve saklayın; şifreleme de üzerine düşeni yapacaktır
Gerçek dosya şifrelemesi HotXLS'te tek bir çağrıdır. Disiplin, çağrının etrafındaki her şeyde yaşar: Parola saklama, HotXLS'in kendi çıktısını yeniden açmasını engelleyen salt yazılır sınır ve bir denetimde savunabileceğiniz bir algoritma iddiası. SaveAsEncrypted ve eski gidiş-dönüş, yolda hiçbir Excel otomasyonu olmadan, Delphi ve C++Builder süreçlerinde yerel olarak çalışan HotXLS Bileşeni ile birlikte gelir