Avatar billede moddi100 Seniormester
01. februar 2009 - 12:26 Der er 8 kommentarer og
1 løsning

Kryptering og dekryptering med nøgle

Hej

Jeg leder efter en funktion der kan kryptere en streng og så dekryptere den senere ud fra an nøgle.
Formålet er, at jeg skal gemme nogle passwords til f.eks. en FTP-konto i min database. Hvis man så kigger direkte i database, skal det ikke være muligt at se passwordet men den krypterede streng. Når mit system så skal bruge det, skal strengen dekrypteres.

Hvordan kan jeg lave det? Nøglen eller hvad man skal kalde den, regnede jeg med at have i en af mine filer.
Avatar billede welcor Nybegynder
01. februar 2009 - 12:44 #1
Generelt vil jeg foreslå at du undgår at bruge algoritmer, der kræver en dekryptering. Det vil sige, at istedet for

1. input "password"
2. krypter "password"->"krypteret password"
3. lagre "krypteret password" i DB
4. modtag sammenligningsstreng "testPassword"
5. hente "krypteret password" i DB
6. dekrypter "krypteret password"->"password"
7. sammenlign "testPassword" med "password"

bør bruge

1-5. som ovenfor
6. krypter "testPassword"->"krypteret testPassword"
7. sammenlign "krypteret testPassword" med "krypteret password"

dette fordi di får mulighed for at bruge et meget bredere spekter af krypteringsalgoritmer (hashes) og undgår sikkerhedshullet det er at have dekrypteringsnøglen liggende og flyde i en fil.

Som krypteringsalgoritme her kan du f. eks. bruge blowfish, md5, aes eller des. Alt efter hvor sikkert du vil have det.
php.net skriver om de forskellige måder at bruge crypt på her:
http://no.php.net/manual/en/function.crypt.php
Avatar billede moddi100 Seniormester
01. februar 2009 - 13:05 #2
Lad mig prøve at forklare det igen.

Jeg kryptere et password ved hjælp af en nøgle.
Så gemmer jeg password i DB, nøglen ligger så fast i mit script.

Når jeg så skal bruge passwordet hentes det fra databasen og dekrypteres ved hjælp af nøglen.

Dette skal ske, da jeg IKKE skal sammenligne og tjekke password, men skal bruge det til f.eks. at oprette FTP-forbindelse.

Metoden er ofte brugt hos diverse backup-firmaer, hvor brugeren angiver sin personlige nøgle. Hans data bliver så krypteret ved hjælp af den. Når han så skal have sine data igen, indtaster han sin nøgle og data bliver dekrypteret. Det er samme princip jeg ønsker.
Avatar billede welcor Nybegynder
01. februar 2009 - 13:20 #3
Ok. Så skal du have fat i mcrypt funktionerne:
http://no.php.net/manual/en/ref.mcrypt.php

på siden http://no.php.net/manual/en/function.mcrypt-encrypt.php har "dylan at wedefy dot com" dette eksempel (med en enkelt rettelse fra yours truly):

<?php
class Cipher {
    private $securekey, $iv;
    function __construct($textkey) {
        $this->securekey = hash('sha256',$textkey,TRUE);
        $this->iv = mcrypt_create_iv(32);
    }
    function encrypt($input) {
        return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->securekey, $input, MCRYPT_MODE_ECB, $this->iv));
    }
    function decrypt($input) {
        return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->securekey, base64_decode($input), MCRYPT_MODE_ECB, $this->iv), "\0");
    }
}

$cipher = new Cipher('secret passphrase');

$encryptedtext = $cipher->encrypt("hide me");
echo "->encrypt = $encryptedtext<br />";

$decryptedtext = $cipher->decrypt($encryptedtext);
echo "->decrypt = $decryptedtext<br />";

var_dump($cipher);
?>
Avatar billede moddi100 Seniormester
01. februar 2009 - 13:44 #4
Den virker så ikke når det skal gemmes i database... IV skal nemlig også bruges til dekryptering.

Er denne mere sikker? http://no.php.net/manual/en/function.mcrypt-create-iv.php

function my_encrypt($string,$key) {
  srand((double) microtime() * 1000000); //for sake of MCRYPT_RAND
  $key = md5($key); //to improve variance
  /* Open module, and create IV */
  $td = mcrypt_module_open('des', '','cfb', '');
  $key = substr($key, 0, mcrypt_enc_get_key_size($td));
  $iv_size = mcrypt_enc_get_iv_size($td);
  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  /* Initialize encryption handle */
  if (mcrypt_generic_init($td, $key, $iv) != -1) {

      /* Encrypt data */
      $c_t = mcrypt_generic($td, $string);
      mcrypt_generic_deinit($td);
      mcrypt_module_close($td);
      $c_t = $iv.$c_t;
      return $c_t;
  } //end if
}

function my_decrypt($string,$key) {
  $key = md5($key); //to improve variance
  /* Open module, and create IV */
  $td = mcrypt_module_open('des', '','cfb', '');
  $key = substr($key, 0, mcrypt_enc_get_key_size($td));
  $iv_size = mcrypt_enc_get_iv_size($td);
  $iv = substr($string,0,$iv_size);
  $string = substr($string,$iv_size);
  /* Initialize encryption handle */
  if (mcrypt_generic_init($td, $key, $iv) != -1) {

      /* Encrypt data */
      $c_t = mdecrypt_generic($td, $string);
      mcrypt_generic_deinit($td);
      mcrypt_module_close($td);
      return $c_t;
  } //end if
}

Jeg synes der ser ud til at være stoppet en hel masse "unødvendigt" på, men øger det sikkerheden??
Avatar billede welcor Nybegynder
01. februar 2009 - 15:52 #5
Så længe man bruger MCRYPT_MODE_ECB, er initialvektoren ikke i brug. ECB står for "electronic codebook". Læs evt. mere om det her:
http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29

Den anden version du viser, bruger cfb (Cipher feedback), som kræver en initialvektor:
http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29

selve krypteringsalgoritmen som bruges er henholdsvis Rijndael256 og DES - her er Rijndael langt sikrere, mens DES er hurtig. Så det er egentlig op til dig, hvad du mener er nødvendigt.
Avatar billede welcor Nybegynder
01. februar 2009 - 16:00 #6
Som det fremgår af wikipediasiden - ECB laver "mønstre" på outputtet, da den samme kryptering gentages flere gange.

Du kan evt. skifte linjerne med teksten
$td = mcrypt_module_open('des', '','cfb', '');

ud med
$td = mcrypt_module_open('rijndael-256', '', 'ofb', '');
Avatar billede moddi100 Seniormester
13. april 2011 - 21:27 #7
Endte med at bruge mcrypt som beskrevet. Smider du et svar?
Avatar billede welcor Nybegynder
13. april 2011 - 21:48 #8
gerne :)
Avatar billede moddi100 Seniormester
07. juli 2011 - 16:38 #9
Har lavet et nyt indlæg, da jeg lige skal have diskuteret valget af algoritme og mode lidt mere :)

http://www.eksperten.dk/spm/942572
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB