SilverStripe 密码解/加密不起作用


SilverStripe password de/encrypting doesn't work

因为这里来自 3dgoo 的巨大帮助 将敏感数据存储在银条中我能够创建这个数据对象来存储客户端密码 -> http://www.sspaste.com/paste/show/5257a5ccdf990

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

有人可以帮我修复它吗?错误在哪里?

如果你不称一个意识形态的错误,我就无法发现错误本身,因为你没有

使用文本字段时,您实际上并没有将密码重写为哈希版本。

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

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

因此,您不会捕获写入或读取以具有加密或解密功能。

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

其示例为:

1(以这种方式添加字段

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

2( 为类创建二传手:

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(在数据库中添加新的盐田,记得运行/dev/build

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

我修改了获取和设置字段以使用此处创建的盐。不是在成员中找到的那个,因为在这一点上,我们现在实际上没有成员关系,因此 $this->Member(( 可能为空。

"工作"示例 http://www.sspaste.com/paste/show/5257f7743cf0b