Pytanie w sprawie encryption, php, encoding, obfuscation – zaciemnić lub zaszyfrować niektóre dane zwykłego tekstu w PHP

12

Muszę zaciemnić lub zaszyfrować niektóre dane zwykłego tekstu w mojej aplikacji php 5.2.

Wolałbym rozwiązanie, które ma ciąg wejściowy i ciąg wyjściowy zachowują tę samą długość.

Nie musi to być bardzo silny, ponieważ istnieje wiele innych warstw bezpieczeństwa. Silny byłby dobry, ale to po prostu powstrzyma programistów / dba / support ludzi / etc przed przypadkowym odczytaniem tekstu z bazy danych.

Kluczowe kwestie

EDYTUJ DODAJ Wolałbym rozwiązanie, które ma ciąg wejściowy i ciąg wyjściowy zachowują tę samą długość.tylko tekst napisowy będzie zaciemniony / zaszyfrowany w celu przechowywania w bazie danychaplikacja php będzie musiała zaciemnić / zaszyfrować dane przed zapisaniem bazy danych i będzie musiała usunąć obfuskację / dencrypt po przeczytaniu bazy danychjest to modyfikacja istniejącej aplikacjitylko niektóre kolumny będą musiały być zaciemnione / zaszyfrowanetylko niektóre wiersze będą musiały być zaciemnione / zaszyfrowane na podstawie pola Typdo obsłużenia jest tylko kilka punktów ładowania / zapisywaniamaksymalny rozmiar kolumny jest już określony dla niektórych pól, ale nie dla innych, ale wolałbym, aby rozwiązanie działało w ramach istniejącego rozmiaru zastrzeżonych pólEDIT, ADD klucz będzie prawdopodobnie złożeniem niektórych podstawowych informacji o kluczu + pól nieedytowalnych

Oto przykładowa tabela bazy danych i dane:

<code>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}[email protected]45kjg 43       6/25/2009 6:45am
4             N       same old, same old text  21       6/25/2009 8:11am
</code>

Aplikacja ładuje i wyświetla wiersze 1,2 i 4 normalnie. Jednak warunkowo (na podstawie typu wiersza) obsługiwałoby tekst w wierszu 3, używając tej logiki zaciemniania / szyfrowania i odszyfrowywania / deszyfrowania.

Czy każdy może podać ukryty / zaszyfrować i odszyfrować / odszyfrować kod funkcji, linki i wskaźnik, który mógłby tutaj pomóc?

dzięki!

EDYTOWAĆ
Podoba mi się prosty pomysł kodowania base64, ale czy istnieje metoda, która pozwala zachować dane w ustalonym rozmiarze. Wszystkie wymienione dotychczas metody mają wartość wyjściową większą niż wartość wejściowa. Będzie to problem dla niektórych kolumn, w których użytkownik może wprowadzić 50 znaków i jest przechowywany w kolumnie varchar (50).

Mam taką samą sytuację i zamierzam zrobić prostą rot13. user1637281
@pure_code, jeszcze w 2009 roku, po prostu nie chciałem oglądać danych podczas obsługi aplikacji. W żaden sposób nie próbowano zabezpieczyć danych KM.
@Sean McSomething, nie chcę oglądać danych podczas pracy w systemie i ufam sobie. KM.
Istnieje duża różnica między kodowaniem a szyfrowaniem, więc nie rozumiem, dlaczego traktujesz je jak podobne procesy. Musisz najpierw odpowiedzieć na kilka pytań: czy dane są poufne, czy nie, czy deweloperzy mają bezpośredni dostęp do bazy danych, jeśli możesz zaakceptować, że kilku programistów może dekodować wiadomości, w jaki sposób ten schemat ochrony jest przydatny. Jeśli używasz base64, każdy może wyeksportować listę i zdekodować ją. Wadih M.

Twoja odpowiedź

7   odpowiedzi
3

to nawet nie potrzebujesz do tego wiele php, możesz to zrobić wewnątrz zapytania za pomocą funkcji ciągu mysqlencrypt(text, password) idecrypt(text, password)

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

DECODE(crypt_str,pass_str)

Odszyfrowuje zaszyfrowany ciąg crypt_str za pomocą pass_str jako hasła. crypt_str powinien być łańcuchem zwracanym przez ENCODE ().

ENCODE(str,pass_str)

Zaszyfruj str za pomocą pass_str jako hasła. Aby odszyfrować wynik, użyj DECODE ().

Wynikiem jest ciąg binarny o tej samej długości co str.

Siła szyfrowania zależy od tego, jak dobry jest generator losowy. Powinien wystarczyć na krótkie łańcuchy.

aktualizacja: byłaby inna możliwośćrot13 ^^

@ricebowl, ale potrzebuję tylko prostego rozwiązania KM.
Rot13 jest idealny, jeśli potrzebujesz czegoś, co jest nieczytelne, ale nie można go odhaczyć. user1637281
ale dla niektórych rot13 może być całkiem czytelny. daver
Naprawdę podoba mi się ten sam ciąg znaków, jednak nie jestem na mysql. Rot13 wygląda obiecująco KM.
5

Jeśli chcesz bardzo silny, możesz zajrzećmcrypt.

Ale jeśli tylko tak działający programiści nie mogą przeczytać tekstu bez jakiejkolwiek pracy, aby to zrobić. Wtedy możesz po prostuBASE64 go koduje lubuuencode to

7

kodowanie base64? Używamy tego, aby wiadomości SMS w naszej DB Gateway SMS były nieczytelne dla programistów.

@dusoft: jego SMS ma być „nieczytelny”? =) David Thomas
każdy może powiedzieć na pierwszy rzut oka, że ​​base64 jest używany i dekoduje go w sekundę. jak to sprawia, że ​​SMS jest „nieczytelny”? dusoft
base64 wydłuża tekst, nie o tej samej długości ... Lucas - Better Coding Academy
Naszym celem nie było „szyfrowanie” tylko po to, by „nie było łatwo czytelne”. Byłem jednym z deweloperów i tak, mogłem go zdekodować w ciągu sekundy. karim79
4

ska PHP), możesz użyćmcrypt_encrypt imcrypt_decrypt lubię to:

<code>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");
}
</code>

który używa globalnego$key i AES (bardzo silny).

Wadami są wydajność (w porównaniu z prostszymi, takimi jak Base64) i trzeba jakoś naprawić klucz.

Twoje zdrowie,

2

P, ale jest łatwy do pobrania i bardzo często używany. Otoszybki tutorial o tym, co możesz z tym zrobić.

Najlepiej jest upewnić się, że klucz, którego używasz do szyfrowania, jest przechowywany w bezpiecznym miejscu, ale jeśli nie interesujesz się bezpieczeństwem, prawdopodobnie po prostu zakodowałbyś klucz w swoim kodzie.

17


strunowystrtr (string $ str, string $ from, string $ to)

kodować w php:

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

dekodować w php:

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

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

w razie potrzeby możesz łatwo odtworzyć tę logikę w DB (bez zapętlania):Korzystanie z tabeli liczb, Erland Sommarskog

@pure_code, z instrukcji: Kodowanie ROT13 po prostu przesuwa każdą literę o 13 miejsc w alfabeciepozostawiając nietknięte znaki alfa. Kodowanie i dekodowanie odbywa się za pomocą tej samej funkcji, przekazanie zakodowanego ciągu jako argumentu zwróci oryginalną wersję. nie było to o wiele trudniejsze, ale znacznie utrudnia uzyskanie informacji z zakodowanego ciągu. KM.
prawdopodobnie coś w tym stylu, jeśli masz tabelę liczb, jest to proste przy użyciu CHAR, coś na liniiselect char(number) from numbers where number<255 KM.
Naprawdę podoba mi się idea bazy 64, ale potrzebuję danych, aby pasowały do ​​istniejących pól bazy danych. Rot13 () był dość prosty i miał ten sam rozmiar, ale ten strtr () jest wystarczająco dobry dla mojego celu. KM.
Jak wybrałeś lub wygenerowałeś ciągi, których używasz powyżej. Rot13 wygląda na prostszy, dlaczego dodatkowa złożoność? user1637281
Tak, wiem. Pytałem, jak wygenerowałeś dwa ciągi. Jestem zbyt leniwy, by liczyć, ale wygląda na to, że wziąłeś ASCI (256 znaków) i przesunąłeś 128 znaków user1637281
4

Wypróbuj te funkcje PHPconvert_uuencode iconvert_uudecode:

<code>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
</code>
Funkcje tego nie wymagają atiruz
Dlaczego zignorowałeś słowo „długość”? Vishal Kumar Sahu

Powiązane pytania