|
@@ -1,27 +1,30 @@
|
|
|
<?php
|
|
|
namespace Juju\Data;
|
|
|
+ require_once('encryption.class.php');
|
|
|
|
|
|
class SecureString implements \JsonSerializable {
|
|
|
private $data;
|
|
|
private $password;
|
|
|
private $iv;
|
|
|
- private $method;
|
|
|
- private static $methods = null;
|
|
|
+ private $encryption;
|
|
|
private function __construct(string $data){
|
|
|
+ $tries = 0;
|
|
|
+ $methods = Encryption::methods();
|
|
|
do{
|
|
|
- if(is_null(self::$methods)){
|
|
|
- self::$methods = openssl_get_cipher_methods();
|
|
|
- }
|
|
|
- $this->method = self::$methods[random_int(0, count(self::$methods) - 1)];
|
|
|
- $ivlen = openssl_cipher_iv_length($this->method);
|
|
|
+ $method = $methods[random_int(0, count($methods) - 1)];
|
|
|
+ $this->encryption = Encryption::from($method);
|
|
|
+ $ivlen = $this->encryption->iv_len();
|
|
|
$this->password = openssl_random_pseudo_bytes($ivlen);
|
|
|
$this->iv = openssl_random_pseudo_bytes($ivlen);
|
|
|
- $this->data = openssl_encrypt($data, $this->method, $this->password, \OPENSSL_RAW_DATA, $this->iv);
|
|
|
+ $this->data = $this->encryption->encrypt($data, $this->password, $this->iv);
|
|
|
+ if(++$tries == count($methods)){
|
|
|
+ throw new \Exception("Too many failed attempts to encrypt data");
|
|
|
+ }
|
|
|
// If for some reason the data we encrypted will not decrypt, try again until it will
|
|
|
}while($data != (string)$this);
|
|
|
}
|
|
|
public function __toString(){
|
|
|
- return ''.openssl_decrypt($this->data, $this->method, $this->password, \OPENSSL_RAW_DATA, $this->iv);
|
|
|
+ return ''.$this->encryption->decrypt($this->data, $this->password, $this->iv);
|
|
|
}
|
|
|
public function jsonSerialize(){
|
|
|
return "{$this}";
|
|
@@ -30,4 +33,4 @@
|
|
|
return new self($data);
|
|
|
}
|
|
|
}
|
|
|
-?>
|
|
|
+?>
|