2013-09-29 3 views
1

Я хочу хранить конфиденциальную информацию (в основном пароли) в объекте data в silverstripe. Данные необходимо хранить в зашифрованном виде в базе данных. Если я вызываю это поле в своем шаблоне, мне нужны данные, дешифрованные.Хранить данные сенсибилизации в Silverstripe 3.1

Но я не знаю, как это сделать. Может кто-нибудь указать мне в правильном направлении?

Thx!

+0

Сохранение данных паролей с обратимым хэшем немного противоречит идее его безопасности? Решением может быть использование ключа шифрования, но если этот ключ взломан, все ваши данные скомпрометированы, особенно потому, что этот ключ должен быть доступен сервером в любое время, поэтому под угрозой. – colymba

+0

Почему вы хотите назовите это в своем шаблоне? Вы хотите отобразить пароль для пользователя? Или просто проверьте, правильно ли введен пароль? – 3dgoo

+0

Я хочу показать его пользователю, если он ему нужен. например, пароль ftp. не хорошая идея? – invictus

ответ

2

Что вы можете сделать, это создать PasswordDataObject с объектом Member, имеющим отношение «один ко многим» к объекту Password. Вы можете использовать соль зарегистрированного участника с помощью двухсторонней функции шифрования php для шифрования и дешифрования пароля.

В этом примере кода используется php mcrypt с солью-членом для шифрования и дешифрования пароля.

Класс пароля содержит описание, адрес, имя пользователя и пароль. Он содержит функцию для шифрования данной строки с использованием заданного ключа. Он также содержит функцию дешифрования для дешифрования сохраненного пароля с использованием связанной соли членов.

класс Пароль

<?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)))); 
    } 

} 

Нам необходимо расширить объект членам иметь отношения has_many с объектом Пароль:

MemberPasswordListExtension

<?php 
class MemberPasswordListExtension extends DataExtension { 

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

Это необходимо в вашей конфигурации, чтобы добавить расширение:

_config.php

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

Ниже приводится форма для добавления пароля. При представлении мы шифруем пароль, используя соль члена и функцию шифрования из класса Password.

Page_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

Вы можете легко заменить другой шифровать/дешифровать метод с остальной частью этого кода, как вы хотите.

+0

Ничего себе, большое спасибо. Я проведу этот вечер, как только приеду домой :) После этого я опубликую свои результаты. – invictus

+0

@ cSGermany - Вам повезло с этим? – 3dgoo

+0

Sry Я не смог проверить это до сих пор:/Но на данный момент я настраиваю новую страницу с серебряными полосками, чтобы проверить ее. Я опубликую свои результаты примерно за 15 - 30 минут – invictus

1

По умолчанию Silverstripe 3.x хранит пароли с необратимым соленым хешем с использованием Blowfish. Вы можете писать разные классы PasswordEncryptor для обработки других действий. См. Различные классы в framework/security/PasswordEncryptor.php для примеров того, как это делается. Внедрите PasswordEncryptor_Custom.php где-нибудь в своей собственной базе кода (т. Е. Mysite /) и повторно реализуйте все функции.

Обратите внимание, что это очень нетипично и идет вразрез с лучшими практиками безопасности. Как правило, вы никогда не должны делать пароли открытого текста доступными кому-либо, периоду. Реверсивное шифрование паролей по своей сути небезопасно, так как вы фактически заменяете один пароль открытого текста (пользователя) другим (открытым текстовым ключом). Всегда лучше просто сбросить пароль с помощью другого хеша.

+0

, я думал, что пользователь может войти в систему, и он может получить доступ к своим паролям, ftp, mysql и т. Д., И я не хочу хранить их как открытый текст в базе данных. знаете ли вы безопасный способ решить эту проблему? – invictus

+1

Поскольку вы не используете его для аутентификации, достаточно зашифровать пароль с помощью некоторого ключа, прежде чем хранить его в базе данных. Используйте хеш пароля Blowfish в качестве ключа и извлеките соль из него, а затем соедините его с секретным ключом, закодированным в приложении. Любой, кто компрометирует вашу базу данных, также потребует доступа к вашему веб-серверу для дешифрования ключа. Вам потребуется декодировать и перекодировать каждый раз, когда пользователь меняет свой пароль. –

Смежные вопросы