如果你不称这是意识形态上的错误,我无法在其中发现错误本身,因为你没有。
当您使用文本字段时,您实际上并没有将任何地方的密码重写为散列版本。
这与 db 元素的实际字段有关:
new TextField('Password', _t('Dict.PASSWORD', 'Password'))
因此,您不会捕获写入或读取来进行加密或解密。
使其工作的一种方法是将文本字段直接绑定到不是 db 关系的自定义 getter/setter,然后获取并设置实际的 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) 将新的 salt 字段添加到 db,记得运行 /dev/build
static $db = array (
'Type' => 'Text',
'Username' => 'Text',
'Password' => 'Text',
'URL' => 'Text',
'Webadmin' => 'Text',
'Editable' => 'Text',
"Salt" => "Text"
);
我修改了 get 和 set 字段以使用此处创建的 salt。不是在成员中找到的那个,因为在这一点上,我们实际上现在没有成员关系,所以 $this->Member() 可能为空。
“工作”示例http://www.sspaste.com/paste/show/5257f7743cf0b