2010-10-05 16 views
6

Pracuję nad moją pierwszą bezpieczną witryną zakupową. Nie przechowujemy danych dotyczących kart kredytowych, więc nie stanowi to problemu. Mamy jednak klucz transakcyjny i klucz logowania API do naszej bramki płatności (authorize.net), którą wolałbym przechowywać w bazie danych, zamiast twardego kodowania do mojego php. Nie wiem, że potrzebujemy ogromnego bezpieczeństwa, ale wolałbym nie przechowywać go w zwykłym tekście. Wiem o Sha, ale to jest w jedną stronę. Potrzebuję sposobu na przechowywanie wartości w bazie danych w pół-bezpiecznym formacie, ale potem będę w stanie "odszyfrować" programowo, aby użyć go w mojej funkcji.Szyfrowanie dwukierunkowe w PHP - potrzebujesz wskazówek

Dodatkowym zastrzeżeniem jest to, że moja witryna jest hostowana, co oznacza, że ​​istnieje bardzo ścisły limit na to, jakie rzeczy mogę zainstalować, więc najlepiej każde rozwiązanie będzie opierało się na czymś, co jest dołączone do standardowej instalacji php.

Czy ktoś może wskazać mi właściwy kierunek? Jestem bardzo nowy w zabezpieczaniu danych.

EDYCJA DO ADD: Sprawdziłem z moim hostem i zainstalowałem mcrypt. Czy to właściwy kierunek, aby się przyjrzeć?

+0

Nie można chronić swoich danych przed administratorem firmy hosta. Po prostu nie jest to możliwe w teorii. –

+0

Nie próbujemy chronić danych od administratora hosta; Chcemy się upewnić, że jeśli zostaną zhakowani, a nasza baza danych zostanie naruszona, kluczami do naszej bramki płatności nie są zwykły tekst. – EmmyS

Odpowiedz

2

MCrypt może być twój przyjaciel. Należy jednak wziąć pod uwagę, że każda publicznie dostępna (i użyteczna) metoda szyfrowania wymaga klucza. Jeśli szyfrowanie AES lub szyfrowanie 3DES nie wymagało klucza podczas procesu szyfrowania, złamanie szyfrowania byłoby tylko kwestią wypróbowania każdej standardowej metody deszyfrowania, dopóki nie uzyskasz znaczącego wyniku. Dlatego przechowywanie klucza do bramki płatności wiąże się z dokładnie takim samym ryzykiem, jak przechowywanie klucza do szyfrowania. Bez względu na to, ile warstw szyfrowania chcesz dodać, na pewnym poziomie będzie musiał być klucz zapisany zwykłym tekstem, zwykle zakodowany w PHP i często w dołączonym pliku config.php, aby ułatwić zmianę w przyszłości .

Jedyną opcją dla bezpiecznego przechowywania informacji bez użycia klucza jest wymyślenie własnej metody szyfrowania. Bezpieczeństwo tej metody polega wyłącznie na tym, że nikt nie zna środków, za pomocą których szyfrujesz ciąg znaków, więc nie mają wzoru krok po kroku, aby przejść od tyłu. Jeśli kiedykolwiek komuś powiesz, jak działa szyfrowanie, bezpieczeństwo zostanie utracone. Istnieje również wiele algorytmicznych sposobów łamania prostych szyfrów (np. Zamiana liter). Właśnie dlatego matematycy otrzymują dużo pieniędzy na rozwój rzeczy takich jak AES.

Najlepiej najlepiej zajrzeć pod MCrypt Encrypt i MCrypt Decrypt. W ten sposób, jeśli tylko twój PHP jest zagrożony, wtedy zna klucz użyty do szyfrowania, ale nie ma danych.Jeśli tylko baza danych jest zagrożona, to mają dane, ale nie klucz użyty do zaszyfrowania. Jeśli obaj są narażeni na szwank, jesteś spieprzony. Ale jeśli obaj są narażeni na szwank, jesteście beznadziejni, niezależnie od tego, co robicie, więc jest to dość bezpieczna droga.

+0

Dzięki, Steven. Mam świadomość, że jeśli zarówno kod, jak i baza danych zostaną zhackowane, jesteśmy na dobrej drodze. Ale wszędzie tak jest, prawda? Jest tylko tyle, co możesz zrobić. – EmmyS

+0

Jest jeden sposób, w jaki znam ten problem, w rzeczywistości, ale wiąże się on z DUŻĄ ilością kodu i dużą ilością kosztów. Zrobiłem kiedyś system, który wykorzystał trzy komputery. Jednym z nich był "mistrz PHP", jeden był "wzorcem bazy danych", a drugi "głównym wzorcem". Mistrz PHP miał klucz do wzorca bazy danych, wzorzec bazy danych miał klucz do klucza głównego, a klucz główny miał bazę kluczy (po jednym dla każdego rzędu danych) dla danych w wzorzec bazy danych. Miałem też wszystkie PHP na dysku twardym zaszyfrowane i został odszyfrowany do pamięci RAM, gdy komputer się uruchomił. – stevendesu

+0

Tak, nie jestem pewien, czy nasz klient byłby skłonny zapłacić za ilość pracy, która by zajęła. Dodatkowo, strona jest hostowana w chmurze, więc musimy utrzymywać rzeczy w jednym miejscu. (I nie mogę przestać chichotać i myśleć, "jest tylko zul" za każdym razem, gdy wspominasz o key master ...) – EmmyS

-2

Z punktu widzenia bezpieczeństwa nie ma różnicy, przechowując go w plikach php lub w bazie danych, jeśli ktoś ma dostęp do plików php, ma również dostęp do bazy danych.

pracy z mcrypt nie znaczy, trzeba będzie więcej bezpieczeństwa, (jeżeli nie może odczytać pliki php mogą również zapoznać się z klucza) tak ...

Gdybym był tobą chciałbym przechowywać Klucz API w postaci zwykłego tekstu w pliku znajdującym się poza katalogiem serwera WWW.

wystarczy napisać dobry kod, powinno być dobrze.

+0

Nie przechowujemy jej w bazie danych, aby była bezpieczna; robimy to, abyśmy mogli napisać front-end, aby umożliwić nie-koderowi zmianę wartości, jeśli to konieczne. Powiedział, że wolimy, aby nie były przechowywane w postaci zwykłego tekstu. I znowu - ta strona jest hostowana w chmurze; nie mamy dostępu do katalogów spoza udostępnianej przestrzeni serwera WWW. – EmmyS

+0

W rzeczywistości należy ZAWSZE założyć, że różne składniki zdalnego serwera są indywidualnymi zagrożeniami bezpieczeństwa. Możliwe jest, że poprzez iniekcje SQL lub proste zniekształcone zapytania zwracane są wiersze bazy danych bez naruszania kodu PHP. Dlatego zawsze masz hash - na wszelki wypadek, gdyby ktoś dostał twoją bazę danych. Sole zostały wymyślone, aby zapobiegać atakom na tęczowe tablice, i tak jak klucz mcrypt - jeśli ktoś dostał sól, mogli ją obejść i nadal używać tęczowego stołu. – stevendesu

+0

Nie rozumiem, dlaczego ludzie lekceważą to, co powiedziałem, jeśli wierzysz, że będziesz bezpieczniejszy dzięki hashowaniu, to się nie zmieni. Aby poradzić sobie z tego rodzaju zabezpieczeniami, powinieneś mieć zupełnie inną infrastrukturę, przechowujesz klucz API, będziesz miał takie samo "bezpieczeństwo" z hashem, jak z prostym kodem txt. gdzie przechowujesz pliki połączeń db: p? Powinieneś sprawdzić dokładnie, co ten klucz API może zrobić zamiast tego. To znaczy, że API KEY musi być w stanie wykonać tylko pewne rzeczy ze zdefiniowanego IP etc ... – sathia

0

Hmm, możesz wypróbować szyfrowanie AES. Problem polega na tym, że musisz zapisać skrót hasłowy (98sdfx9c6v5c) gdzieś w swoim PHP.

Insert config:

INSERT INTO config (secret_key) VALUES (AES_ENCRYPT('secret api key','98sdfx9c6v5c')); 

select config:

SELECT AES_DECRYPT(secret_key,'98sdfx9c6v5c') AS secret_url FROM config