Simpel data encryptie class
Aangezien beveiliging steeds belangrijker wordt heb ik een simpel encryptie systeem geschreven waarmee je data kan beveiligingen. Kleine aantekeningen staan in het engels erbij geschreven in het script. Je kan het script voeden met een bestand, mysql record en met een string. Ook is het mogelijk met dit zelfde script de data weer te decrypten.
Omdat het op phpHulp niet toegestaan is .ini files te uploaden heb ik hem hernoemt naar txt! Let op dat je dit weer terug aanpast!
Gesponsorde koppelingen
PHP script bestanden
13 reacties op 'Simpel data encryptie class'
Gesponsorde koppelingen
Ik snap eerlijk gezegt niet waarom het script niet zou mogen werken zonder MySQL verbinding. Wat heeft dat voor toegevoegde waarde? Of mis ik iets belangrijks? En wat ik ook jammer vind is dat het lijkt alsof dit uit een (klein) framework komt, maar dat de verbinding los er in staat (een losse mysql_connect zelfs!)
Het script werkt ook zonder mysql, het script komt uit een ander systeem wat ik zelf gemaakt heb en die leest bestanden in (encryptionByFile) en zet dat dan in mysql, bij het decrypten wil ik de date uit mysql halen en decrypten. daarvoor is het mysql gedeelte nodig. Het is zogemaakt dat dit los als module te gebruiken is bij je eigen systeem en via een config file te koppelen is aan je bestaande applicatie. Verder heb ik het zo flexibel mogelijk proberen te maken.
Er staat 'Simpel' omdat het script gemaakt is als leerdoeleinde en nu gepubliceerd wordt als leerdoeleinde. Niks is perfect alles is kraakbaar maar deze 'simpele' encryptie class is voor veel gebruik meer dan genoeg en door zijn flexibiliteit en eenvoud makkelijk te implementeren in bestaande applicaties.
Veel encryptie mogelijkheden is zijn hedendaags met brutalforce te kraken. Verder zijn er voor 'standaard' encryptie methodes al allemaal hack tools uitgeschreven hiervoor niet.
Zelf gebruik ik deze class bij alle applicaties als een vorm van EXTRA security.
Het zou beter zijn als web applicaties beter beveiligd worden tegen sql aanvallen en dergelijke dat zou dit allemaal niet nodig zijn maar goed dat is weer een ander verhaal.
Veel encryptie mogelijkheden is zijn hedendaags met brutalforce te kraken. Verder zijn er voor 'standaard' encryptie methodes al allemaal hack tools uitgeschreven hiervoor niet.
Zelf gebruik ik deze class bij alle applicaties als een vorm van EXTRA security.
Het zou beter zijn als web applicaties beter beveiligd worden tegen sql aanvallen en dergelijke dat zou dit allemaal niet nodig zijn maar goed dat is weer een ander verhaal.
Zie hoe goed systemen dicht getimmerd zijn :
http://webwereld.nl/nieuws/66012/ov-site-lekt-persoonlijke-data-168-000-reizigers.html
Het is bedoelt voor mensen die net als ik nog beginnen met een studie in dit gebied. Mensen kunnen van elkaar leren, en zoals ik al aangaf is niks onkraakbaar. Voor veel mensen zal dit meer dan genoeg is. Is er ook verder nog positief commentaar :) ?
http://webwereld.nl/nieuws/66012/ov-site-lekt-persoonlijke-data-168-000-reizigers.html
Het is bedoelt voor mensen die net als ik nog beginnen met een studie in dit gebied. Mensen kunnen van elkaar leren, en zoals ik al aangaf is niks onkraakbaar. Voor veel mensen zal dit meer dan genoeg is. Is er ook verder nog positief commentaar :) ?
Zie ook eens de reacties bij dit nieuwsbericht.
De programmeur van die ov website is slordig geweest, als hij gewoon de stelregel 'Vertrouw de gebruiker nooit' had gebruikt dan was die site niet gehackt. Een simpele mysql_real_escape_string of expliciet type casten zou voldoende moeten geweest zijn.
Als je systeem dan gehackt wordt, bijvoorbeeld doordat je bij een slecht geconfigureerde hoster zit waar het mogelijk is om van de ene website gegevens op de andere website te kunnen zien, dan heeft dit script nog niet veel nut. Het script kan dan gewoon bekeken worden, en dus kan het zo weer uitgevoerd worden.
En zoveel veiliger is het script niet,
Je kan aan die laatste hex regel mooi zien dat het repeterend is.
Als je het script zelf niet zou kennen zou je hieraan kunnen afleiden dat de key steeds opnieuw wordt gebruikt, en dus ook zou je de key kunnen afleiden.
Dit script heeft dus écht geen toegevoegde waarde.
De programmeur van die ov website is slordig geweest, als hij gewoon de stelregel 'Vertrouw de gebruiker nooit' had gebruikt dan was die site niet gehackt. Een simpele mysql_real_escape_string of expliciet type casten zou voldoende moeten geweest zijn.
Als je systeem dan gehackt wordt, bijvoorbeeld doordat je bij een slecht geconfigureerde hoster zit waar het mogelijk is om van de ene website gegevens op de andere website te kunnen zien, dan heeft dit script nog niet veel nut. Het script kan dan gewoon bekeken worden, en dus kan het zo weer uitgevoerd worden.
En zoveel veiliger is het script niet,
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php
function encryptionHandler($data, $option = 'encrypt') {
/* *
* Set encryptionKey and start position $key
*/
$encryptionKey = '@N7HONY_HU3B3RS_!@#$%^&*()';
$keyPos = '0';
for ($i = 0; $i <= (strlen($data) - 1); $i++) {
/* *
* Get single character
*/
$char = substr($data, $i, 1);
/* *
* Get ascii code from character
* EDIT: + 1 (255 max but 0 has also a value means max 256)
*/
$char = ord($char) + 1;
/* *
* Get char from key
*/
if($keyPos >= strlen($encryptionKey)) {
$keyPos = '0';
}
$key = substr($encryptionKey, $keyPos, 1);
/* *
* Get ascii code from code
*/
$key = ord($key) + 1;
/* *
* Check option value
*/
if ($option == 'decrypt') {
$key = 256 - $key;
}
/* *
* Summarize $char + $key
*/
$dataBlock = $char + $key;
/* *
* If dataBlock is equal or heigher then 256 do - 256
*/
if($dataBlock >= 256) {
$dataBlock = $dataBlock - 256;
}
/* *
* Get character from datablock
* EDIT: remove the + 1
*/
$dataBlock = chr(($dataBlock - 1));
/* *
* Save data
*/
if(!isset($encryptedData)) {
$encryptedData = $dataBlock;
}else{
$encryptedData .= $dataBlock;
}
/* *
* Increase password position
*/
$keyPos++;
}
return $encryptedData;
}
$blaat = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$blup = encryptionHandler($blaat);
var_dump($blaat, $blup, encryptionHandler($blup, 'decrypt'), bin2hex($blup));
/* Levert:
string(110) 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
string(110) '¢°™ª±°»Áª·•¤•´µÁƒ¢…†‡ÀˆŒŠ‹¢°™ª±°»Áª·•¤•´µÁƒ¢…†‡ÀˆŒŠ‹¢°™ª±°»Áª·•¤•´µÁƒ¢…†‡ÀˆŒŠ‹¢°™ª±°»Áª·•¤•´µÁƒ¢…†‡ÀˆŒŠ‹¢°™ª±°'
string(110) 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
string(220) 'a2b099aab1b0bbc1aab795a495b4b5c183a2858687c0888c8a8ba2b099aab1b0bbc1aab795a495b4b5c183a2858687c0888c8a8ba2b099aab1b0bbc1aab795a495b4b5c183a2858687c0888c8a8ba2b099aab1b0bbc1aab795a495b4b5c183a2858687c0888c8a8ba2b099aab1b0'
*/
?>
function encryptionHandler($data, $option = 'encrypt') {
/* *
* Set encryptionKey and start position $key
*/
$encryptionKey = '@N7HONY_HU3B3RS_!@#$%^&*()';
$keyPos = '0';
for ($i = 0; $i <= (strlen($data) - 1); $i++) {
/* *
* Get single character
*/
$char = substr($data, $i, 1);
/* *
* Get ascii code from character
* EDIT: + 1 (255 max but 0 has also a value means max 256)
*/
$char = ord($char) + 1;
/* *
* Get char from key
*/
if($keyPos >= strlen($encryptionKey)) {
$keyPos = '0';
}
$key = substr($encryptionKey, $keyPos, 1);
/* *
* Get ascii code from code
*/
$key = ord($key) + 1;
/* *
* Check option value
*/
if ($option == 'decrypt') {
$key = 256 - $key;
}
/* *
* Summarize $char + $key
*/
$dataBlock = $char + $key;
/* *
* If dataBlock is equal or heigher then 256 do - 256
*/
if($dataBlock >= 256) {
$dataBlock = $dataBlock - 256;
}
/* *
* Get character from datablock
* EDIT: remove the + 1
*/
$dataBlock = chr(($dataBlock - 1));
/* *
* Save data
*/
if(!isset($encryptedData)) {
$encryptedData = $dataBlock;
}else{
$encryptedData .= $dataBlock;
}
/* *
* Increase password position
*/
$keyPos++;
}
return $encryptedData;
}
$blaat = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$blup = encryptionHandler($blaat);
var_dump($blaat, $blup, encryptionHandler($blup, 'decrypt'), bin2hex($blup));
/* Levert:
string(110) 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
string(110) '¢°™ª±°»Áª·•¤•´µÁƒ¢…†‡ÀˆŒŠ‹¢°™ª±°»Áª·•¤•´µÁƒ¢…†‡ÀˆŒŠ‹¢°™ª±°»Áª·•¤•´µÁƒ¢…†‡ÀˆŒŠ‹¢°™ª±°»Áª·•¤•´µÁƒ¢…†‡ÀˆŒŠ‹¢°™ª±°'
string(110) 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
string(220) 'a2b099aab1b0bbc1aab795a495b4b5c183a2858687c0888c8a8ba2b099aab1b0bbc1aab795a495b4b5c183a2858687c0888c8a8ba2b099aab1b0bbc1aab795a495b4b5c183a2858687c0888c8a8ba2b099aab1b0bbc1aab795a495b4b5c183a2858687c0888c8a8ba2b099aab1b0'
*/
?>
Je kan aan die laatste hex regel mooi zien dat het repeterend is.
Als je het script zelf niet zou kennen zou je hieraan kunnen afleiden dat de key steeds opnieuw wordt gebruikt, en dus ook zou je de key kunnen afleiden.
Dit script heeft dus écht geen toegevoegde waarde.
Wat Karl nu demonstreerde vermoedde ik al, maar heb zelfs niet eens de moeite genomen om het te testen.
Als iemand je ge-encrypte string 'vindt' dan weet ie al metteen de lengte van de originele string! Dat is namelijk even lang. Dit is al het grootste security lek van je encryptie en die is al gevonden zonder maar naar je code te kijken..
Dus ja mcrypt binnen je functie gebruiken zou veel veiliger zijn! Let daar maar eens op de lengte van de encrypted strings..
En brute-force != kraken. Tegen brute-force kan niets gedaan worden, maar het breken van de encryptie is bij geen enkele grote encryptie methode gelukt.
Als iemand je ge-encrypte string 'vindt' dan weet ie al metteen de lengte van de originele string! Dat is namelijk even lang. Dit is al het grootste security lek van je encryptie en die is al gevonden zonder maar naar je code te kijken..
Dus ja mcrypt binnen je functie gebruiken zou veel veiliger zijn! Let daar maar eens op de lengte van de encrypted strings..
En brute-force != kraken. Tegen brute-force kan niets gedaan worden, maar het breken van de encryptie is bij geen enkele grote encryptie methode gelukt.
't is al wel een beetje gezegd, maar volgens mij leg jij de verantwoordelijkheden verkeerd, want in de encryptie class ga jij mysql spul gebruiken, dat kan nooit handig zijn. Wat beter is, een aparte encryptie class en een aparte database class, en die dan met elkaar laat praten. Kortom, laat de crypt class alleen encrypten/decrypten, laat een database class het database spul doen en een file class de bestanden. Dan kan je zo, een andere encryptie toepassen zonder dat de rest het merkt! En verder is het geen encryptie, maar gewoon omschrijven van je tekst. Zoals eerder gezegd, ga zelf geen encryptie bouwen, maar gebruik gewoon bestaande (geaccepteerd als veilig) encryptie methoden.
Om te reageren heb je een account nodig en je moet ingelogd zijn.
- Details
Door:
Anthony Huebers- 2 jaar geleden
- 1.592 x bekeken
- Labels
Encryptie, encryption, php, data, beveiliging, secure, encrypt file, encrypt mysql record, encrypt string
- PHP scripts opties
- Classes
- Nieuwste PHP scripts
- PHP script toevoegen


PHP hulp
0 seconden vanaf nu