Mysql
 sql >> Database >  >> RDS >> Mysql

Memorizzare i dati sensibili in Silverstripe 3.1

Quello che potresti fare è creare una Password DataObject con il Member oggetto che ha una relazione uno a molti con la Password oggetto. Puoi utilizzare il sale del membro che ha effettuato l'accesso con una funzione di crittografia php a 2 vie per crittografare e decrittografare una password.

Questo codice di esempio utilizza php mcrypt con il membro salt per crittografare e decrittografare la password.

La classe password ha una descrizione, un URL, un nome utente e una password. Contiene una funzione per crittografare una determinata stringa utilizzando una determinata chiave. Contiene anche una funzione di decrittografia per decrittografare la password memorizzata utilizzando il sale membro connesso.

Classe di password

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

}

Dobbiamo estendere l'oggetto Membro per avere una relazione has_many con l'oggetto Password:

Estensione MemberPasswordList

<?php
class MemberPasswordListExtension extends DataExtension {

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

Questo è necessario nella tua configurazione per aggiungere l'estensione:

_config.php

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

Di seguito è riportato un modulo per aggiungere una password. Al momento dell'invio crittografiamo la password utilizzando il sale membro e la funzione di crittografia della classe Password.

Controller_Pagina

...

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

...

Nel modello di pagina chiamiamo il modulo e scorre le password salvate sotto questo utente. Mostriamo il nome utente, la password crittografata e la password decifrata, solo per mostrarci che ha funzionato:

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

...

Questo dovrebbe darti una base per quello che vuoi fare e dovresti essere in grado di cambiarlo in base alle tue esigenze.

Il metodo di crittografia è stato preso da questa risposta StackOverflow:Più semplice crittografia bidirezionale tramite PHP

Puoi facilmente sostituire un metodo di crittografia/decodifica diverso con il resto di questo codice come desideri.