PHP bazı düz metin verileri karartmak veya şifrelemek

7 Cevap php

Benim php 5.2 uygulamada bazı düz metin verileri karartmak veya şifrelemek gerekir.

Ben giriş dize dize ve çıkış aynı uzunlukta tutmak olurdu bir çözümü tercih ederim.

Yerinde güvenlik çok sayıda diğer tabakalar olduğu gibi bu, son derece güçlü bir gerek yoktur. Güçlü iyi olurdu, ama bu sadece yanlışlıkla veritabanı içinde gelen metni okumaktan etc / programcı / dba / support insanları koruyacaktır.

önemli hususlar

  • EDIT ADD Ben giriş dize dize ve çıkış aynı uzunlukta tutmak olurdu bir çözümü tercih ederim.
  • yalnızca dize metin bir veritabanında depolamak için şifreli / karartılmış olacak
  • php uygulama veritabanı kaydetmeden önce verileri şifrelemek / karartmak için ihtiyacınız olacak ve veritabanı okuma aşağıdaki un-obfuscate/dencrypt gerekir
  • Bu, varolan bir uygulama için bir değişiklik olduğunu
  • sadece bazı sütunlar karartılmış gerekir / şifrelenmiş
  • sadece bazı satırlar bir Tür alanında dayalı / şifreli karartılmış gerekir
  • sadece bir kaç yük vardır / işlemek için puan kaydetmek
  • maksimum sütun boyutu zaten bazı alanlar için belirlenen, ama başkaları için değil, ama ben kısıtlı alanların mevcut büyüklüğü içinde çalışmak için bir çözümü tercih ederim edilir
  • EDIT, ADD tuşuna muhtemelen bazı Birincil anahtar bilgi + düzenlenemeyen alanların bir bileşkesi olacak olacak

Burada örnek bir veritabanı tablo ve verileri:

int           char(1) varchar(24)              int      date
MyPrimaryKey  RowType UserText                 UserNo   DateChange
------------  ------- ------------------------ -------- ----------------
1             N       nothing special here     43       6/20/2009 12:11am
2             N       same thing, wow!         78       6/23/2009 1:03pm
3             S       fBJKg}.jkjWfF78dlg@45kjg 43       6/25/2009 6:45am
4             N       same old, same old text  21       6/25/2009 8:11am

Uygulama yüklemek ve ekran satırlar 1,2, ve normalde 4 olacaktır. Ancak şartlı (satır türüne göre) Bu allak bullak / şifrelemek ve un-obfuscate/decrypt mantığı kullanarak aralıksız 3 metin işlemek olur.

Herkes burada yardımcı olacağını allak / şifrelemek ve un-obfuscate/decrypt fonksiyonları kodu, bağlantılar, ve veya işaretçi sağlayabilir?

teşekkürler!

EDIT
I like the simple base64 encoding idea, but is there a method that can keep the data within a fixed size. All methods listed so far have the output value larger than the input value. This will be a problem for some columns, where the user can enter in 50 characters and it is stored in a varchar(50) column.

7 Cevap

for simple obfuscation use strtr() - Translate certain characters:
string strtr ( string $str , string $from , string $to )

to encode in php:

$readable='This is a special test string ABC123 ([+,-!#$%&*])';    
$unreadable=strtr($readable,' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
                           ,'¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ '
                      );
print $unreadable; //outputs: "ÕéêôAêôAâAôñæäêâíAõæôõAôõóêïèAÂÃIJ³´A©Ü¬­®¢¤¥¦§«Þª"

to decode in php:

$unreadable='ÕéêôAêôAâAôñæäêâíAõæôõAôõóêïèAÂÃIJ³´A©Ü¬­®¢¤¥¦§«Þª';
$readable=strtr($unreadable,'¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ '
                           ,' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'

               );
print $readable; //outputs: "This is a special test string ABC123 ([+,-!#$%&*])"

gerekirse kolayca (loop olmadan) DB bu mantığı çoğaltmak: Using a Table of Numbers, by Erland Sommarskog

Peki base64 encoding? Biz geliştiriciler tarafından bizim SMS Geçidi DB okunmaz SMS mesajları yapmak için kullanabilirsiniz için kullanabilirsiniz.

Bir kaç seçenek vardır.

Eğer çok güçlü istiyorsanız, mcrypt. içine bakmak olabilir

Ama eğer sadece bu çalışan geliştiriciler aslında bunu yapmak için bazı uğraşmadan metni okuyamıyorum. Sonra biraz, sadece BASE64 encode it veya uuencode it

(Tüm Mevcut PHP ortamlar var) yüklü Mcrypt varsa, mcrypt_encrypt kullanabilir ve mcrypt_decrypt Bunun gibi:

function encrypt ($text) {
  global $key;
  return mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, "abcdefghijklmnopqrstuvwxyz012345");
}

function decrypt ($secret) {
  global $key;
  return rtrim (mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $key, $secret, MCRYPT_MODE_ECB, "abcdefghijklmnopqrstuvwxyz012345"), "\0");
}

Küresel $key ve AES (çok güçlü) kullandığı.

Dezavantajları (Base64 gibi basit olanları karşılaştırıldığında) ve size bir şekilde anahtar düzeltmek zorunda performans vardır.

Alkış,

Mcrypt kütüphanesi kullanarak deneyin. Bu standart PHP ile birlikte, ancak kolayca indirilebilir ve çok yaygın olarak kullanılan bu değil. İşte a quick tutorial onunla neler yapabileceğini bulunuyor.

Bu emin şifreleme için kullanabileceğiniz anahtar güvenli bir yerde saklanır yapmak en iyisidir, ancak güvenlik konusunda gerçekten endişe değilse, muhtemelen sadece yere koduna anahtarı hardcoding Tamam olurdu.

Eğer sürüm yaklaşık 5 mysql kullanıyorsanız, o zaman bile mysql string fonksiyonları encrypt(text, password) ve decrypt(text, password) ile sorgu içinde bunu yapabilirsiniz, bunun için çok php gerekmez

http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html

  • DECODE(crypt_str,pass_str)

    Şifre olarak pass_str kullanarak crypt_str şifreli dize şifresini çözer. crypt_str) Encode (döndürülen bir dize olmalıdır.

  • ENCODE(str,pass_str)

    Şifre olarak pass_str kullanarak str şifreleyin. Sonucu şifresini çözmek için, Decode () kullanın.

    Sonuç str ile aynı uzunlukta bir ikili dizisidir.

    Şifreleme gücü rastgele ne kadar iyi dayanır. Bu kısa dizeleri için yeterli olacaktır.

güncelleme: Başka bir olasılık rot13 ^ ^ olurdu

Bu PHP fonksiyonları deneyin convert_uuencode ve convert_uudecode:

function encrypt_decrypt ($data, $encrypt) {
    if ($encrypt == true) {
        $output = base64_encode (convert_uuencode ($data));
    } else {
        $output = convert_uudecode (base64_decode ($data));
    }
    return $output;
}

$enc_txt = encrypt_decrypt ("HELLO DATA", true);
echo $enc_txt."\n"; // KjIkNSwzJFxAMSQlNDAwYGAKYAo=
echo encrypt_decrypt ($enc_txt, false); // HELLO DATA