gpt4 book ai didi

php - 在 Silverstripe 3.1 中存储敏感数据

转载 作者:行者123 更新时间:2023-11-29 05:26:57 24 4
gpt4 key购买 nike

我想将敏感信息(主要是密码)存储在 silverstripe 的数据对象中。数据需要加密存储在数据库中。如果我在我的模板中调用这个字段,我需要解密数据。

但是我不知道该怎么做。有人可以指出我正确的方向吗?

谢谢!

最佳答案

您可以做的是创建一个 Password DataObject,其中 Member 对象与 Password< 具有一对多关系 对象。您可以使用登录成员(member)的盐和 2 路 php 加密功能来加密和解密密码。

此示例代码使用带有成员 salt 的 php mcrypt 来加密和解密密码。

密码类有描述、url、用户名和密码。它包含一个使用给定 key 加密给定字符串的函数。它还包含一个解密函数,使用连接的成员盐解密存储的密码。

密码类

<?php
class Password extends DataObject
{
static $db = array (
'Description' => 'Text',
'URL' => 'Text',
'Username' => 'Text',
'Password' => 'Text'
);

static $has_one = array (
'Member' => 'Member'
);

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

public function encryptPassword($key, $password) {
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $password, MCRYPT_MODE_CBC, md5(md5($key))));
}

}

我们需要扩展 Member 对象使其与 Password 对象具有 has_many 关系:

成员密码列表扩展

<?php
class MemberPasswordListExtension extends DataExtension {

private static $has_many = array(
'Passwords' => 'Password'
);
}

这需要在您的配置中添加扩展:

_config.php

...
Member::add_extension('Member', 'MemberPasswordListExtension');
...

以下是添加密码的表单。在提交时,我们使用密码类中的成员盐和加密函数对密码进行加密。

页面 Controller

...

public function AddPasswordForm() {
// Create fields
$fields = new FieldList(
new TextField('Description'),
new TextField('URL'),
new TextField('Username'),
new TextField('Password')
);

// Create actions
$actions = new FieldList(
new FormAction('AddPassword', 'Submit')
);

return new Form($this, 'AddPasswordForm', $fields, $actions);
}

public function AddPassword($data, $form) {
if($member = Member::currentUser()) {
$password = new Password();
$form->saveInto($password);
$password->MemberID = $member->ID;
$password->Password = $password->encryptPassword($member->Salt, $password->Password);
$password->write();
}
return $this->redirectBack();
}

...

在页面模板中,我们调用表单并循环遍历保存在该用户下的密码。我们显示用户名、加密密码和解密密码,只是为了向我们展示这是有效的:

Page.ss 模板

...

<% if $CurrentMember %>
$AddPasswordForm
<% end_if %>

<% with $CurrentMember %>
<h3>Passwords</h3>
<% if $Passwords %>
<ul>
<% loop $Passwords %>
<li>$Username $Password $DecryptedPassword</li>
<% end_loop %>
</ul>
<% else %>
<p>No passwords saved</p>
<% end_if %>
<% end_with %>

...

这应该为您想要做的事情提供一个基础,并且您应该能够根据自己的需要对其进行更改。

加密方法取自这个stackoverflow答案: Simplest two-way encryption using PHP

您可以根据需要用此代码的其余部分轻松替换不同的加密/解密方法。

关于php - 在 Silverstripe 3.1 中存储敏感数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19079073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com