sql >> Databasteknik >  >> RDS >> Mysql

Lagra känslig data i Silverstripe 3.1

Vad du kan göra är att skapa ett Password DataObject med Member objekt som har en en till många relation till Password objekt. Du kan använda saltet av den inloggade medlemmen med en 2-vägs php-krypteringsfunktion för att kryptera och dekryptera ett lösenord.

Den här exempelkoden använder php mcrypt med medlemmen salt för att kryptera och dekryptera lösenordet.

Lösenordsklassen har en beskrivning, en url, användarnamn och lösenord. Den innehåller en funktion för att kryptera en given sträng med en given nyckel. Den innehåller också en dekrypteringsfunktion för att dekryptera det lagrade lösenordet med hjälp av det anslutna medlemssaltet.

Lösenordsklass

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

}

Vi måste utöka Member-objektet för att ha en has_many-relation med Password-objektet:

MemberPasswordListExtension

<?php
class MemberPasswordListExtension extends DataExtension {

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

Detta behövs i din konfiguration för att lägga till tillägget:

_config.php

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

Följande är ett formulär för att lägga till ett lösenord. Vid inlämning krypterar vi lösenordet med hjälp av medlemssaltet och krypteringsfunktionen från klassen Lösenord.

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

...

I sidmallen kallar vi formuläret och går igenom lösenorden som sparats under denna användare. Vi visar användarnamnet, det krypterade lösenordet och det dekrypterade lösenordet, bara för att visa oss att detta har fungerat:

Page.ss-mall

...

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

...

Detta bör ge dig en bas för vad du vill göra, och du bör kunna ändra det efter dina behov.

Krypteringsmetoden togs från detta stackoverflow-svar:Enklast tvåvägskryptering med PHP

Du kan enkelt ersätta en annan kryptera/dekryptera metod med resten av denna kod som du vill.



  1. Importerar zippad CSV-fil till PostgreSQL

  2. PostgreSQL 9.6:Parallell Sequential Scan

  3. MySql:Fråga flera identiska dynamiska tabeller

  4. Data för långa för kolumn i Django på MySQL