sql >> Databáze >  >> RDS >> Mysql

Ukládejte citlivá data v Silverstripe 3.1

Co můžete udělat, je vytvořit Password DataObject s Member objekt mající vztah jedna k mnoha k Password objekt. K šifrování a dešifrování hesla můžete použít sůl přihlášeného člena s funkcí 2cestného šifrování php.

Tento příklad kódu používá php mcrypt s členem salt k zašifrování a dešifrování hesla.

Třída hesla má popis, adresu URL, uživatelské jméno a heslo. Obsahuje funkci pro zašifrování daného řetězce pomocí daného klíče. Obsahuje také funkci dešifrování pro dešifrování uloženého hesla pomocí připojené členské soli.

Třída hesla

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

}

Potřebujeme rozšířit objekt Member tak, aby měl vztah has_many s objektem Password:

MemberPasswordListExtension

<?php
class MemberPasswordListExtension extends DataExtension {

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

Toto je potřeba ve vaší konfiguraci pro přidání rozšíření:

_config.php

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

Následuje formulář pro přidání hesla. Při odeslání heslo zašifrujeme pomocí členské soli a funkce šifrování ze třídy 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();
}

...

V šabloně stránky voláme Formulář a procházíme hesly uloženými pod tímto uživatelem. Zobrazujeme uživatelské jméno, zašifrované heslo a dešifrované heslo, jen abychom nám ukázali, že to fungovalo:

Šablona 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 %>

...

To by vám mělo poskytnout základ pro to, co chcete dělat, a měli byste být schopni to změnit podle svých potřeb.

Metoda šifrování byla převzata z této odpovědi stackoverflow:Nejjednodušší obousměrné šifrování pomocí PHP

Zbytkem tohoto kódu můžete snadno nahradit jinou šifrovací/dešifrovací metodu, jak si přejete.



  1. Smyčka SQL Server – jak mohu procházet sadou záznamů

  2. Jak převedu interval na počet hodin pomocí postgres?

  3. Jak opravit poškozenou tabulku xampp 'mysql.user'?

  4. Django Multiple Databases Fallback to Master, pokud Slave nefunguje