Menü
Bedava
giriş
ev  /  Navigatörler / Dosyaları PHP'de şifreleme. PHP komut dosyalarının analiz ve modifikasyondan korunması

PHP'deki dosyaları nasıl şifreleyebilirsiniz. PHP komut dosyalarının analiz ve modifikasyondan korunması

Herhangi bir bilgi, dahil olmak üzere şifrelenebilir ve deşifre edilebilir. pHP'yi kullanma.. Bu dil, basit, karmaşık kadar basit veri şifreleme yeteneğine sahiptir.

Temel şifreleme yöntemlerini düşünün

base64. - Verilerin MIME Base64 algoritması tarafından şifrelemenizi ve şifresini çözmenizi sağlar. Anahtarları kullanmaz ve genellikle PHP'ye referansları gizlemek için kullanılır.

Örnekler:
// metin metin
$ Text \u003d "link";
Echo Base64_encode ($ metin); // Sayı: PGEGAHJLZJ0IIYI + 0KHRGDGL0LVQUTCWPC9HPG \u003d\u003d
// decriprovka
ECHO Base64_DeCode ("PGEGAHJLZJ0IIYI + 0KHRGDGL0LVQUTCWPC9HPG \u003d\u003d");
?>

Gördüğümüz gibi, ilk önce Base64_encode işlemini kullandık ve şifreyi aldı: PGEGAHJLZJ0IYI + 0KHRGDGL0LVQUTCWPC9HPG \u003d\u003dVe sonra BASE64_DECODE'ye koyun ve bağlantıyı geri alın.

md5 - Tek taraflı olarak verilere sahip olmanıza izin verir. Yani, Base64'ten farklı olarak, artık onları geri alamazsınız. Genellikle, MD5, veritabanında şifreleri saklamak için kullanılır, ancak son zamanlarda şifrelenmiş MD5 kombinasyonu kod çözme masalarında, birçok sitenin ve algoritmanın nezaketinde bulunması kolaylaştı. Bu nedenle, MD5 şifrelerini blowfish'teki algoritmaları daha iyi değiştirmek için saklamak için.

Misal:

// metin metin
Echo MD5 ("Kombinasyon");
?>

Anahtarla şifreleme

Ve söylemek istediğim son şifreleme / şifre çözme örneği, anahtarı (şifre olarak) kullanır. Yani, şifreleme işlevine benzersiz bir anahtarı iletirsiniz, kod ile şifrelenir. Şifreleme için, şifreli bir kodun özelliklerini ve yalnızca bildiğiniz bir anahtarın özelliklerini sağlamanız gerekir. Kodun altındaki işlevleri kullanma örneği.

İşlev __encode ($ metin, $ tuş) (



$ Enc_text \u003d Base64_encode (Mcrypt_Generic ($ iv. $, $ İv. $ TD));
Mcrypt_generic_deinit ($ td);
Mcrypt_module_close ($ td);
$ Enc_Text; ))
Strtohex işlevi ($ string) (
$ hex \u003d "";
için ($ i \u003d 0; $ i< strlen($string); $i++) { $hex .= dechex(ord($string[$i])); }
$ Hex iade; )
İşlev __Decode ($ metin, $ tuş) (
$ Td \u003d mcrypt_module_open ("üçlüler", "", "CFB", "");
$ İv_size \u003d mcrypt_enc_get_iv_size ($ td);
$ iv \u003d mcrypt_create_iv (mcrypt_enc_get_iv_size ($ td), mcrypt_rand);
Eğer (mcrypt_generic_init ($ td, $ tuşu, $ iv)! \u003d -1) (
$ decode_text \u003d Substr (MDECrypt_Generic ($ TD, Base64_Decode ($ TD, BASE64_DECODE ($ TEXT)), $ iv_size);
Mcrypt_generic_deinit ($ td);
Mcrypt_module_close ($ td);
$ Decode_text; ))
Hextostr işlevi ($ HEX) (
$ string \u003d "";
için ($ i \u003d 0; $ i< strlen($hex)-1; $i+=2) { $string .= chr(hexdec($hex[$i].$hex[$i+1])); }
$ Dize dönüş; )

$ str \u003d "şifrelemek için gereken çörekler!
Anahtarla";
$ Code \u003d Strtohex (__ kod çözme ($ str, "# key-do-36-simvolov"));
Echo "şifreli kod:" $ KOD. "
";

$ str \u003d __Decode (Hextostr ($ Kod), "# Key-do-36-Simvolov");
Echo "şifresi çözülmüş kod:" $ str. "
";
?>

HTML içeriğiyle şifreleyebilirsiniz. Anahtar uzunluğu 36 karakterden fazla olmamalıdır.

Bu yöntem bazı verileri şifrelemek ve bunları bir txt dosyasına veya veritabanına yerleştirmek ve anahtar şifre çözme ile birlikte kullanılabilir.

Tabii ki, herhangi bir kod şifresi çözülebilir / hacklenebilir ve bu istisna değildir, bu nedenle güvenilir şifreleme yöntemlerini kullanın.

İki sunucu arasında veri alışverişi gereklidir. Verileri trafiği dinlemekten elde etmek için, veriler şifrelenir. Örneğin, botnet içindeki eylemin devri. Bu esasen bir şifreleme olan şeydir, ancak kodlama denir ve bilinen işlevler böyle bir kodu çözmek için kullanılır.

Pseudo-zevkinin bir başka örneği olarak, bir CMS'nin veritabanındaki "Şifreleme" şifrelerinin bir örneğini vereceğim - şifreler MD5 () () veya, ancak Basitçe Base64 ile şifrelenmemektedir. Şunlar. Bazın boşaltıldığında, hacker, yerleşik PHP işlevi Base64_deCode () aracılığıyla tüm şifreleri deşifre etmek için bir iş olmayacaktır.

Ayrıca, birinin metni kesip deşifre edebileceği endişelenmeden veri iletmemiz gerekir. PHP, iki yönlü şifreleme özellikleri (yani, veriler aslında şifreleyici ve kod çözme) sunan popüler bir Mcrypt veri şifreleme paketine sahiptir.

Mcrypt sürüm 2.4.7, aşağıdaki simetrik şifreleme algoritmalarını destekler: Blowfish, RC2, SAFER-SK64 XTEA, CAST-256, RC4, SAFER-SK128, DES, RC4-IV, Yılan, Enigma, Rijndael-128, Threeway, Rijndael-192 , Üçlü, loki97, rijndael-256, twoca, Panama, SaferPlus, vb. Her algoritma hakkında daha fazla bilgi, Wikipedia'da yazılmıştır.

Simetrik şifreleme kullanıldığından, anahtar her iki tarafça da bilinmeli ve gizli tutulmalıdır.

Örnek şifreleme ve şifre çözme ipi

mcrypt_module_open ("des", "", "ECB", "")
Bu özellik algoritma modülünü ve kullanılan modu açar. Bu örnek için, ECB modunda des algoritması.

$ Key \u003d Substr ($ key, 0, mcrypt_enc_get_key_size ($ td));
Mcrypt_enc_get_key_size () işlevini arayarak maksimum anahtar boyutu elde edilmelidir ve her değer elde edilenden daha azdır.

$ s \u003d mcrypt_generic ($ td, $ kaynak);
Şifrelendiğinde, veri uzunluğunu N * BlockSize'de garanti etmek için sıfır bayt ile doldurulur. Bloksize blok boyutu algoritma ile belirlenir (des boyut bloğu 64 için). Bu nedenle, çizginin ucunda kod çözülürken, Trim () işlevi tarafından silinen "\\ 0" görünebilir.

Cryptography'nin temel gerçeklerinden biri, profesyonel değilseniz, bu alanda hiçbir şey icat etmenin gerekli olmadığını belirtir. Bu kısmen doğrudur, çünkü en iyileri uzun süredir icat edildi, attı ve alanda bir on yıl kullanmadı. bilişim Teknolojileri. Gerçeğin diğer tarafı, bazı bilgi alanlarının gelişmesinin yalnızca içindeki sürekli taze fikirlerin ve orijinal çözümlerin sürekli akışıyla gerçekleşmesidir.

Açık nedenlerden gelince, AES gibi sanayi kriptografi devlerine yakalanmayacağız ve Blackjack ve Sevinçli kendi kriptografik anketlerine konuşması gibi, konuşması için, soslu sanayi şifrelemesi üzerine yakalanmayacağız.

Kısmen çünkü kısmen, kısmen bir şeyi simüle etmek ve bunu tanınmış standartlarla karşılaştırmak, kontrast, etkili çözümler ve Frank ihmalleri ile karşılaştırarak, verimliliği arttırmak için ne yapabileceğinizi anlıyorsunuz.

Ama oldukça su.

Web uygulamamızın PHP'ye yazıldığını varsayalım, geri dönüşümlü şifreleme olması gerekiyor ve şifreleme sisteminizi yazma güçlerinde olduğuna inanıyoruz.

Öyleyse yaz kendi sistemi Küçük bir firma korumalı şifreleme algoritmasının aşağıdaki belirtilerine sahip olan özel ve ortak anahtarlarla geri dönüşümlü şifreleme:

  1. Son şifredeki gürültü sembollerinin varlığı.
  2. Her kanaldaki bilgiler gönderen-muhatap özel bir anahtarda şifrelenir ve uygunluk işlevi her bir anahtar için benzersiz olacaktır.
  3. Her mesaj bir sindirim kodu alır - özel bir anahtardan ve kaynak mesajından bir işlevdir. Bu, uygunluk işlevinin benzersizliğini sağlamak için gereklidir "orijinal sembolü<=> Kodlanmış karakter "sadece" Gönderen Adresi "kanalı için değil, her bir mesaj için de geçerlidir.

    Dolayısıyla, kodlanmış ve kaynak karakterlerinin yazışmesinin, şifreleme analizi uygulayarak belirli bir mesajla bilindiği biliniyor olsa bile, örneğin frekans analizi, bu, başka bir mesajın çalışmasında herhangi bir tercih vermez.

  4. Frekans analizini zorlaştırmak için, her kaynak mesaj sembolünü iki şifre sembolü ile kodlayacağız.
Peki ne oldu.

Aslında, son sonuç görülebilir.

SymCoder sınıfı, şifreleme ve şifreleme yöntemlerini içerir.

Şifreleme, girişdeki orijinal mesajı kabul eden kod () yöntemini gerçekleştirir.

Burada, Tab_Coded'deki üretilen eşleştirme tablosundaki bir mesaj, kenarlar boyunca ve gürültü sembollerinin içinde seyreltilmiş şifreli bir mesaj oluşturur.

Gürültü sembolleri, bu arada, kanal tuşu kullanılarak oluşturulduğundan, ancak mesajlara özgü olmayan her kanal gönderen-muhatabına benzersizdir. Code_symbols'ta şifreleme için kullanılan semboller, bazı noktalama işaretleri ve%, @, vb.

Her kodlanmış sembol, kod_symbols'tan iki karakterden oluşur. Kodlanmış sembollerden birkaç kez daha azdır.

CREATE_TAB_CODEDED uyumluluk tablosu, kod sembol dizisindeki öğelerin sayısına eşit bir öğe miktarı ile bir diziye olan bir diziyi çeviren bir ana bilgisayar tuşu kullanılarak oluşturulmuştur. İki taneli kodların başlatılmasının pozisyonu da her zaman farklıdır ve kanal tuşu ile ilişkilidir. Bu, kodlanmış sembollerin atlanması için algoritmanın ve kod sembollerine uygunluğun her zaman (iyi veya garantili) farklı olacağından emin olmayı mümkün kılar.

Örneğin, "Merhaba, dünya" mesajı kodlandı, şöyle görünüyor:

[E-posta Korumalı]@=!=-.?&1.#&?=:.:.1%!&-%@[E-posta Korumalı]%~&1^#=?%%.!%+.?.~=?..&?%&&:%~.#%@&1&1.#=?.#.?.!&1==&=.-=!

Ancak aynı mesaj tekrar kodlandı:

DIGEST-A00BF11D - \u003d:.? \u003d: &!.?. 1 ve - \u003d: \u003d?.? \u003d.?! & \u003d%! \u003d -% @ \u003d!% ~. \u003d ^ #.% 1.! % + \u003d: [E-posta Korumalı]==%&&1%~.1%@[E-posta Korumalı][E-posta Korumalı]=:&1.==:=!.1&:

Aynı mesajın sindirmesinin çakıştığını, ancak şifreyi farklı hale geldiği görülebilir - gürültü sembolleri keyfi uygunluk eklenir ve her yeni şifreleme için herhangi bir sırada.

Mesajlar, mesaj hacminin arttıkça,% 10'luk gürültüye ulaşma sınırında (en kısa mesajlar için, gürültü yüzdesi% 90 ve daha yüksek), şifrelenmiş mesajın minimum uzunluğu 116 karakterdir. Bazı eksi birinden biri bu method Şifreleme - Kodlanmış mesajları en az iki kez artırır.

Kod çözme, kod simgesinin ters çevirisinde yer almaktadır - kaynak sembolü mesajdan kesilmiş. Anahtar olarak ne olabilir? Prensip olarak, herhangi bir dize, alıcının görünümünün her bir çift için benzersizdir.

Örneğin, mesajların şifrelemesiyle bir haberci oluşturursanız, bu durumda, kapalı anahtarın en basit seçeneği MD5 ($ user_id_1. $ Tuzu. $ User_id_2) olabilir, ardından anahtar her mesaj kanalı için benzersiz olacaktır.

(PHP 4, PHP 5, PHP 7)

crypt - Tek yönlü dize karma

Uyarı

Bu işlev (henüz) ikili güvenli değildir!

Açıklama.

mezar odası. (string $ str. [, dize $ tuz. ]): Dize

mezar odası () Sistemde mevcut olabilecek standart UNIX DES-BASED algoritması veya alternatif algoritmaları kullanarak karma bir dizgiyi iade edecektir.

Tuz parametresi isteğe bağlıdır. Ancak, mezar odası () Tuzsuz zayıf bir karma oluşturur. PHP 5.6 veya daha sonra bir E_NOTICE hatasını kaldırın. Daha iyi güvenlik için güçlü bir tuz belirlediğinizden emin olun.

şifre_hash () Güçlü bir karma kullanır, güçlü bir tuz oluşturur ve otomatik olarak uygun turlar uygular. şifre_hash () Basittir. mezar odası () Sarıcı ve mevcut şifre hashes ile uyumlu. Kullanımı. şifre_hash () teşvik edilir.

Bazı işletim sistemleri birden fazla hash türünü destekler. Aslında, bazen standart des bazlı algoritma, MD5 tabanlı bir algoritma ile değiştirilir. Karma tipi tuz argümanı tarafından tetiklenir. 5.3'ten önce, PHP, mevcut algoritmaları sistemin Crypt () 'nin üzerine bağlı olarak belirlenir. Tuz sağlanmazsa, PHP standart iki karakter (des) tuzu veya on iki karakter (MD5) otomatik olarak oluşturur. ), MD5 Crypt () kullanılabilirliğine bağlı olarak. PHP adında bir sabit set Crypt_salt_length. Mevcut hasmalar tarafından izin verilen en uzun geçerli tuzu gösterir.

Standart des tabanlı mezar odası () Tuzu, çıktının ilk iki karakteri olarak döndürür. Aynı zamanda sadece STR'nin ilk sekiz karakterini kullanır, bu nedenle başlayan daha uzun dizeler aynı sonucu oluşturur (tuz kullanır).

Crypt () işlevinin birden fazla hash türünü desteklediği sistemlerde, aşağıdaki sabitlerin, verilen türün mevcut olup olmadığına bağlı olarak 0 veya 1 olarak ayarlanmıştır.

  • Crypt_std_des. - Alfabeden iki karakter tuzu olan standart des tabanlı karma. ./0-9a-za-z. Tuzdaki geçersiz şarjlar kullanmak, Crypt () başarısızlığın başarısız olmasına neden olur.
  • Crypt_ext_des. - Genişletilmiş des tabanlı karma. "Tuz", bir alt çizgiden oluşan 9 karakterlik bir dizedir, ardından 4 bayt yineleme sayısı ve 4 bayt tuzdur. Bunlar, yazdırılabilir karakterler, karakter başına 6 bit, önce en az önemli karakter olarak kodlanmıştır. 0 ila 63 değerleri ./0-9a-za-z olarak kodlanır ". Tuzdaki geçersiz şarjlar kullanmak, Crypt () başarısızlığın başarısız olmasına neden olur.
  • Crypt_md5. - 1 $ ile başlayan on iki karakter tuzu ile MD5 karma
  • Crypt_blowfish - Blowfish aşağıdakiler gibi bir tuzla having: "$ 2A $", "$ 2Y $" veya "$ 2Y $", iki basamaklı bir maliyet parametresi, "$" ve alfabesinden 22 karakter "./0-9A- Za-z ". Bu aralığın dışındaki karakterleri tuzu kullanarak, kript () sıfır uzunlukta bir dize dönmesine neden olur. İki haneli maliyet parametresi, birleştirilmesi için yineleme sayısının ungoritması için yineleme sayısının taban-2 logaritmasıdır ve 04-31 aralığında baz arasında, bu aralığın dışındaki değerler Crypt () başarısızlığın başarısız olmasına neden olur. 5.3.7'den önce PHP'nin sürümleri, yalnızca tuz öneki olarak "2a $ $" desteği: PHP 5.3.7, Blowfish uygulamasında bir güvenlik zayıflığını düzeltmek için yeni önekleri tanıttı. Lütfen güvenlik düzeltmesinin tam ayrıntılarına bakın, ancak özetlemek için, yalnızca PHP 5.3.7'yi hedefleyen geliştiriciler ve daha sonra "2A $ 2A $" tercihinde 2Y $ "kullanmalıdır.
  • Crypt_sha256. - SHA-256 Hash, 5 $ ile ön eklenmiş on altı karakter tuzu ile. Tuz dizesi "Rounds \u003d" ile başlarsa
  • Crypt_sha512 - 6 $ ile ön eklenmiş on altı karakter tuzu ile SHA-512 karma. Tuz dizesi "Rounds \u003d" ile başlarsa $ ", N'nin sayısal değeri, hashing döngüsünün blowfish üzerindeki maliyet parametresi gibi kaç kez yürütülmesi gerektiğini belirtmek için kullanılır. Varsayılan tur sayısı 5000'dir, en az 1000 ve maksimum 99999'dur. 999. Bu aralığın dışında herhangi bir N seçimi en yakın sınıra kadar kesilecektir.

PHP 5.3.0'dan itibaren, PHP kendi uygulamasını içerir ve sistem bir veya daha fazla algoritmalar için destek eksikliği yoksa bunu kullanır.

Parametreler.

Telsiz olacak.

Dikkat

Kullanmak Crypt_blowfish Algoritma, STR parametresinin maksimum 72 karakterliğe kadar kesilmesiyle sonuçlanacaktır.

Hashing'i açmak için isteğe bağlı bir tuz dizesi. Eğer verilmezse, davranış algoritma uygulaması tarafından tanımlanır ve beklenmedik sonuçlara yol açabilir.

Dönüş değerleri.

Hashed String veya 13 karakterden kısa olan bir dizgiyi döndürür ve tuzdan arızadan farklılık göstermesi garanti edilir.

Uyarı

Şifreleri doğrularken, zamanlama saldırılarına karşı savunmasız bir dize karşılaştırma işlevi, OFT'nin çıktısını karşılaştırmak için kullanılır. mezar odası () Önceden bilinen karma için. PHP 5.6'dan itibaren sağlar hash_equals () Bu amaç için.

Changelog.

Sürüm. Açıklama.
5.6.5 "* 0" hata dizgisi, tuz olarak verildiğinde, "* 1" artık diğer CRYPT uygulamalarıyla birlikte tutarlılık için iade edilecektir. Bu sürümden önce, PHP 5.6 yanlış bir DES karh döndürür.
5.6.0 Tuz ihmal edilirse E_NOTICE güvenlik uyarısını yükseltin.
5.5.21 "* 0" hata dizgisi, tuz olarak verildiğinde, "* 1" artık diğer CRYPT uygulamalarıyla birlikte tutarlılık için iade edilecektir. Bu sürümden önce, PHP 5.5 (ve önceki şubeler) yanlış bir DES karh döndürür.
5.3.7 Katma $ 2x $ Ve. $ 2Y $. Potansiyel yüksek bit saldırılarla başa çıkmak için bluefish modları.
5.3.2 Ulrich Drepper "s" uygulamasına dayanan SHA-256 ve SHA-512 CRYPT eklendi.
5.3.2 "Arıza" dizgisini ("* 0" veya "* 1") geri dönmek için geçersiz turlardaki Davranışlar, DES'e geri düşen instad.
5.3.0 PHP şimdi MD5 Crypt, Standart DES, Extended DES ve Blowfish algoritmaları için kendi uygulamasını içeriyor ve sistemin bir veya daha fazla algoritma için destek eksikliği yoksa bunu kullanacak.

Örnekler.

Örnek 1. mezar odası () Örnekler.

$ hashed_password \u003d crypt ("mypassword"); // Tuzun otomatik olarak oluşturulmasına izin verin

/ * Crypt () sonuçlarını bir karşılaştırmak için tuz olarak geçmelisiniz.
Parola, farklı karma algoritmaları kullanıldığında sorunları önlemek için. (GİBİ.
Yukarıda, standart des tabanlı şifre karma 2 karakterlik bir tuz kullanıyor,
Ancak MD5 tabanlı karma 12.) * /
if (hash_equals ($ hashed_password, crypt ($ user_input, $ hashed_password))) (
Echo "şifre doğrulandı!" ;
}
?>

Örnek # 2 Kullanma mezar odası () Htpasswd ile.

// şifreyi ayarla
$ Şifre \u003d "mypassword";

// karh'i al, tuzun otomatik olarak oluşturulmasına izin ver
$ hash \u003d crypt ($ şifre);
?>

Örnek # 3 Kullanma mezar odası () Farklı karma tipleri ile

/ * Bu tuzlar sadece örneklerdir ve kodunuzda verbatim kullanılmamalıdır.
Her şifre için farklı, doğru biçimlendirilmiş bir tuz oluşturmalısınız.
*/
if (crypt_std_des \u003d\u003d 1) (
Echo "Standart des:". Crypt ("rasmuslerdorf", "rl"). "\\ n";
}

eğer (crypt_ext_des \u003d\u003d 1) (
Yankı "uzatılmış des:". Crypt ("rasmuslerdorf", "_j9..rasm"). "\\ n";
}

if (crypt_md5 \u003d\u003d 1) (
Echo "MD5:". Crypt ("Rasmuslerdorf", "$ 1 $ Rasmusle $"). "\\ n";
}

if (crypt_blowfish \u003d\u003d 1) (
Echo "Blowfish:". Crypt ("rasmuslerdorf", "$ 2a $ 07 $ usomesillystringforsalt $"). "\\ n";
}

if (crypt_sha256 \u003d\u003d 1) (
Echo "SHA-256:". Crypt ("rasmuslerdorf", "5 $ $ tur \u003d 5000 $ usoMesillyStringforsalt $"). "\\ n";
}

if (crypt_sha512 \u003d\u003d 1) (
Echo "SHA-512:". Crypt ("rasmuslerdorf", "$ 6 $ tur \u003d 5000 $ usomesillystringforsalt $"). "\\ n";
}
?>