Ik heb een aantal .txt bestanden waarin 5 regels staan. De naam en het emailadres (regel 3 en 4) zijn encrypted op geslagen, vanwege privacy.

Een .txt bestand ziet er zo uit:


id-5e0786c07c802 // id
Friends //category
ygkKcL/jz9U= // naam (encrypted)
6gkKcL/jz9XuVRNayyIVcFbLw3ord0nc7IJj // email (encrypted)
902d95a9bf1c3f59a3996e4e7b4dec79 // token


Voorheen had ik de naam en email niet encrypted en gebruikte ik onderstaande code om bijv te zoeken op emailadres:


<?php
/* EMAIL SEARCH */
$email_search = $_GET['email_search']; // get string from url for search
if (isset($email_search)) {
    $searchthis = strtolower($email_search);    
    $email_matches = array();

    $files = glob("subscribers/*.txt"); // Specify the file directory by extension (.txt)

    foreach($files as $file) { // Loop the files in the directory   {

        $handle = @fopen($file, "r");

        if ($handle) {

            $lines = file($file);           
            $grab_email = strtolower($lines[3]); // for sorting only

            while (!feof($handle)) {
                $buffer = fgets($handle);

                if(strpos(strtolower($buffer), $searchthis) !== FALSE) // strtolower; search word not case sensitive    

                    $email_matches[$file] = $grab_email; // put all lines in array  indexed by email

            }

            fclose($handle);
        }
    }

}
asort($email_matches);

?>

<!-- search form -->
<form class="search-form form-inline" action="admin.php" method="GET">  
    <div class="input-group mb-3">
        <input class="form-control" type="text" name="email_search" placeholder="Search for..." />
        <div class="input-group-append">                
            <button class="btn btn-primary" type="submit">Search</button>
        </div>
    </div>                          
</form>


Maar nu is de naam en email encrypted en werkt mijn zoekfunctie niet meer uiteraard.
Hoe kan ik nu toch in de encrypted .txt bestanden zoeken op email?

PS: Wat ik heb geprobeerd, en dit werkt ook: de input van search veld eerst encrypten en dan met die encrypte waarde gaan zoeken. Dus als ik wil zoeken op de naam "John", dan encrypt ik eest de naam John, ( wordt bijv iets in de zin van "ub1TSIxADRYhTCuksKS+Gw==") en zoek dan met die encryptiewaarde. maar deze manier verdiend natuurlijk neit de schoonheidsprijs om het zo te doen...
>> Hoe kan ik nu toch in de encrypted .txt bestanden zoeken op email?

Door het betreffende e-mailadres eerst op dezelfde manier te encrypten en vervolgens met die ge-encrypte waarde te gaan zoeken in de tekstbestanden.

(Overigens is het erg omslachtig om gebruikers bij te houden via tekstbestanden. Daar gebruik je normaliter een database voor.)
Ozzie, klopt. dit werkt ook, maar is niet de manier denk ik waarop het hoort.
Eerst decrypten als er zoek request wordt gedaan en dan tijdelijk op slaan in memory of iets dergelijks? Heb overigens geen idee hoe dat zou moeten ook...
Op welke manier encrypt je de naam? Via welke methode?
open_ssl


<?php
$string = 'John';
$met_enc = 'aes256';  
$key_enc = 'sleutel'; 

$iv = '1234567891011121'; // 16 chars

//encrypts the string
$encryption = openssl_encrypt($string, $met_enc, $key_enc, 0, $iv);
$decryption = openssl_decrypt($encryption, $met_enc, $key_enc, 0, $iv);

echo $encryption.'<br />'; 
echo $decryption.'<br />'; 
?>
Oké. Ik denk toch dat de manier die ik heb aangedragen dan de meeste logische is.

>> Eerst decrypten als er zoek request wordt gedaan en dan tijdelijk op slaan in memory of iets dergelijks?

Dus stel je hebt 1.000 users, dan zou je 1.000 tekstbestanden moeten inlezen, gaan decrypten, alle informatie storen enz. Lijkt me niet wenselijk. En wat als je 10.000 gebruikers hebt? Allesbehalve efficiënt.

De zoekwaarde eerst encrypten en met die waarde gaan zoeken in de tekstbestanden is het meest efficiënt. Dat gezegd hebbende ... dit moet je niet willen doen met tekstbestanden. Hiervoor zijn databases uitgevonden.
Ik mag hopen dat het bestand netjes buiten de webroot staat, ook al is het gecodeerd?
Persoonlijk zou ik aanraden om alles netjes in een database plaatsen. Die zijn juist bedoeld om in te zoeken. Vanwaar de beslissing om dit in tekstbestanden op te slaan?
@Arien het staat idd buiten de webroot. Daarom zat ik ook te denken: moet de data daarin dan wel encrypted worden? Niemand kan er toch bij komen? Ja behalve de administrators van mijn hosting company natuurlijk...
>> Daarom zat ik ook te denken: moet de data daarin dan wel encrypted worden? Niemand kan er toch bij komen?

Je hebt het zelf ge-encrypt. Ik neem aan dat je dat met een bepaalde reden hebt gedaan. Een naam of mailadres wordt meestal niet ge-encrypt. Wachtwoorden daarentegen wel ... niet ge-encrypt maar gehashed.

Op zich kan je mailadressen encrypten, maar de enige manier waarop iemand daarbij kan komen is als hij toegang heeft tot de server. Op dat moment heeft hij ook toegang tot de decryptie-methode. Anders gezegd, je zet iets op slot, maar de sleutel ligt ernaast.
@Jack, Je reageert niet op de opmerking om een database te gebruiken.
Heb je de mogelijkheid om een database te gebruiken? Doe dit dan.
Heb je dat niet, heb je de mogelijkheid tot sqlite3? Dit is een filebased database.
Heb je dat ook niet, sla het dan tenminste op als JSON. Dan hoeft het ook maar in 1 bestand ipv meerdere losse en kun je 't veel makkelijker uitlezen (als een array bijvoorbeeld).

Over het zoeken, zoals gezegd eerst de zoekterm encrypten en daarmee zoeken. Let wel op dat sommige encryptie methodes steeds andere uitkomsten geven, dan gaat deze zon niet op.
jawel, ik heb de mogelijkheid om een database te gebruiken. Dit is een beetje begonnen als uitdaging om data op te slaan zonder database maar in flat file bestanden. Omwille van de privacy dacht ik: dit moet je wel gaan encrypten omdat het persoonsgevoelige info is. Tja, en toen realiseerde ik me: oei...dat geeft problemen met de zoekfunctie...
maar idd, een DB is hier de meest aangewezen methode voor. helemaal mee eens. Maar ik wilde gewoon weten of ik een alternatief had om encrypte data te doorzoeken in txt bestanden. En zoals Ozzie al zei: bij elke zoek request, eerst de data encrypten en met de encrypte data gaan zoeken. En dit werkt ook wel , alleen je moet genuanceerder gaan zoeken.
"John" staat bijv met hoofdletter opgeslagen in de txt file.
Als ik zoek op "John" of "john" zal dat nu geen verschil uitmaken doordat ik strtolower gebruik:

<?php
$searchthis = strtolower($order_search);
if(strpos(strtolower($buffer), $searchthis) !== FALSE) // strtolower; search word not case sensitive
?>


Maar als ik de data encrypted ga opslaan, kan ik die strtolower niet meer gebruiken.
"John" geeft encrypted hele andere karakters dan "john" met kleine letter. Das nadeel...

Reageren