sql >> Base de Datos >  >> RDS >> Mysql

Almacene datos confidenciales en Silverstripe 3.1

Lo que podrías hacer es crear una Password DataObject con el Member objeto que tiene una relación de uno a muchos con la Password objeto. Puede usar la sal del miembro que ha iniciado sesión con una función de cifrado php bidireccional para cifrar y descifrar una contraseña.

Este código de ejemplo usa php mcrypt con el miembro salt para cifrar y descifrar la contraseña.

La clase de contraseña tiene una descripción, una URL, un nombre de usuario y una contraseña. Contiene una función para encriptar una cadena dada usando una clave dada. También contiene una función de descifrado para descifrar la contraseña almacenada utilizando el miembro sal conectado.

Clase de contraseña

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

}

Necesitamos extender el objeto Miembro para tener una relación has_many con el objeto Contraseña:

Extensión de lista de contraseñas de miembros

<?php
class MemberPasswordListExtension extends DataExtension {

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

Esto es necesario en su configuración para agregar la extensión:

_config.php

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

El siguiente es un formulario para agregar una contraseña. En el envío, encriptamos la contraseña usando el salt de miembros y la función de encriptación de la clase Contraseña.

Controlador_de_página

...

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

...

En la plantilla de página, llamamos al Formulario y recorremos las contraseñas guardadas con este usuario. Mostramos el nombre de usuario, la contraseña cifrada y la contraseña descifrada, solo para mostrarnos que esto funcionó:

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

...

Esto debería darle una base para lo que quiere hacer, y debería poder cambiarlo según sus necesidades.

El método de cifrado se tomó de esta respuesta de stackoverflow:Más simple encriptación bidireccional usando PHP

Puede sustituir fácilmente un método de cifrado/descifrado diferente con el resto de este código como desee.