Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Armazenar dados sensíveis no Silverstripe 3.1


O que você pode fazer é criar uma Password DataObject com o Member objeto tendo um relacionamento de um para muitos com a Password objeto. Você pode usar o salt do membro logado com uma função php encrypt de 2 vias para criptografar e descriptografar uma senha.

Este código de exemplo usa php mcrypt com o salt membro para criptografar e descriptografar a senha.

A classe de senha tem uma descrição, uma url, nome de usuário e senha. Ele contém uma função para criptografar uma determinada string usando uma determinada chave. Ele também contém uma função de descriptografia para descriptografar a senha armazenada usando o salt membro conectado.

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

}

Precisamos estender o objeto Member para ter um relacionamento has_many com o objeto Password:

MemberPasswordListExtension
<?php
class MemberPasswordListExtension extends DataExtension {

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

Isso é necessário em sua configuração para adicionar a extensão:

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

O seguinte é um formulário para adicionar uma senha. No envio, criptografamos a senha usando o salt membro e a função de criptografia da classe 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();
}

...

No modelo de página, chamamos o formulário e percorremos as senhas salvas nesse usuário. Exibimos o nome de usuário, a senha criptografada e a senha descriptografada, apenas para nos mostrar que isso funcionou:

Modelo 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 %>

...

Isso deve fornecer uma base para o que você deseja fazer e você deve poder alterá-lo de acordo com suas necessidades.

O método de criptografia foi retirado desta resposta do stackoverflow:Simplest criptografia bidirecional usando PHP

Você pode substituir facilmente um método diferente de criptografar/descriptografar com o restante desse código conforme desejar.