SilverStripe密码解密/加密不起作用

时间:2013-10-11 07:35:27

标签: php encryption silverstripe

由于3dgoo的巨大帮助Store Sensitive Data in Silverstripe 我能够创建这个Dataobject来存储ClientPasswords - > http://www.sspaste.com/paste/show/5257a5ccdf990

问题是,在使用 getCMSFields 创建字段后,de /和加密不再起作用,密码将以明文形式存储在数据库中:/

有人可以帮我解决吗?错误在哪里?

1 个答案:

答案 0 :(得分:1)

我无法发现一个错误本身,因为你没有,如果你不打电话给意识形态那个。

使用文本字段时,实际上并没有将密码重写到散列版本的任何位置。

这与db元素的实际字段有关:

new TextField('Password', _t('Dict.PASSWORD', 'Password'))

因此,您没有捕获写入或读取功能,无法进行加密或解密。

使其工作的一种方法是将文本字段绑定到不直接与db关系的自定义getter / setter,然后在get和设置实际的db字段。

该样本是:

1)以这种方式添加字段

$fields->addFieldToTab("Root.Main", new TextField('CusotomgetterSetter', "Set the password")

2)创建类的setter:

public function setCusotomgetterSetter($value){
    if(!$this->Salt){
        $this->Salt = uniqid(mt_rand());
    }
    $test = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($this->Salt), $value, MCRYPT_MODE_CBC, md5(md5($this->Salt))));
    $this->Password = $test;
}

public function getCusotomgetterSetter(){
    return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($this->Salt), base64_decode($this->Password), MCRYPT_MODE_CBC, md5(md5($this->Salt))), "\0");
}

3)向db添加新的salt字段,记得运行/ dev / build

static $db = array (
    'Type' => 'Text', 
    'Username' => 'Text', 
    'Password' => 'Text',
    'URL' => 'Text',
    'Webadmin' => 'Text',
    'Editable' => 'Text',
"Salt" => "Text"
);

我修改了get和set字段以使用这里创建的salt。不是在成员中找到的那个,因为在这一点上我们实际上不存在成员关系,所以$ this-> Member()可能为null。

“工作”样本http://www.sspaste.com/paste/show/5257f7743cf0b