【问题标题】:SilverStripe password de/encrypting doesn't workSilverStripe 密码解/加密不起作用
【发布时间】:2013-10-11 07:35:26
【问题描述】:

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

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

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

【问题讨论】:

  • Where is the bug?: 代码在哪里?
  • 阅读! ;) 我的问题中有两个链接 ;)

标签: php encryption silverstripe


【解决方案1】:

如果你不称这是意识形态上的错误,我无法在其中发现错误本身,因为你没有。

当您使用文本字段时,您实际上并没有将任何地方的密码重写为散列版本。

这与 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

【讨论】:

  • 我试过这样。但结果是一个空字段 ` public function onBeforeWrite() { $this->Password=rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($this->Member()->Salt), base64_decode($this->Password), MCRYPT_MODE_CBC , md5(md5($this->Member()->Salt))), "\0");父::onBeforeWrite(); }`
  • 你可以使用 onbefore write,但是有一个更简单的方法,我把它作为答案发布:)
  • 谢谢,那太好了:)
  • 修改了原始答案以包含示例。
  • 似乎无法发现任何错误,我现在需要继续我的工作,所以现在我给你留下这些提示:你应该调试 set 函数中发生的事情,看看是正确的变量生成密码在那里。第一个测试当然是我的建议对你有用吗:如果你修改函数来做 $this->Password = $value 。 “甜的”;是否正确存储。然后你应该调试它们可用的剩余值:Debug::log($this->Member()->Salt) 等。Debug::log 将一行写入站点根目录的日志文件。或者应该在最少。
猜你喜欢
  • 2018-11-22
  • 2017-11-10
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多