Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Speichern Sie sensible Daten in Silverstripe 3.1

Was Sie tun könnten, ist ein Password zu erstellen DataObject mit dem Member Objekt, das eine Eins-zu-Viele-Beziehung zum Password hat Objekt. Sie können das Salt des angemeldeten Mitglieds mit einer 2-Wege-PHP-Verschlüsselungsfunktion verwenden, um ein Passwort zu verschlüsseln und zu entschlüsseln.

Dieser Beispielcode verwendet php mcrypt mit dem Member Salt, um das Passwort zu verschlüsseln und zu entschlüsseln.

Die Passwortklasse hat eine Beschreibung, eine URL, einen Benutzernamen und ein Passwort. Es enthält eine Funktion zum Verschlüsseln einer bestimmten Zeichenfolge mit einem bestimmten Schlüssel. Es enthält auch eine Entschlüsselungsfunktion, um das gespeicherte Passwort mit dem verbundenen Member-Salt zu entschlüsseln.

Passwortklasse

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

}

Wir müssen das Member-Objekt erweitern, um eine has_many-Beziehung mit dem Password-Objekt zu haben:

MemberPasswordListExtension

<?php
class MemberPasswordListExtension extends DataExtension {

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

Dies wird in Ihrer Konfiguration benötigt, um die Erweiterung hinzuzufügen:

_config.php

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

Das Folgende ist ein Formular zum Hinzufügen eines Passworts. Bei der Übermittlung verschlüsseln wir das Passwort mit dem Member-Salt und der Verschlüsselungsfunktion aus der Klasse 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();
}

...

In der Seitenvorlage rufen wir das Formular auf und durchlaufen die unter diesem Benutzer gespeicherten Passwörter. Wir zeigen den Benutzernamen, das verschlüsselte Passwort und das entschlüsselte Passwort an, nur um uns zu zeigen, dass es funktioniert hat:

Page.ss-Vorlage

...

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

...

Dies sollte Ihnen eine Grundlage für das geben, was Sie tun möchten, und Sie sollten in der Lage sein, es an Ihre Bedürfnisse anzupassen.

Die Verschlüsselungsmethode wurde dieser Stackoverflow-Antwort entnommen:Simplest Zwei-Wege-Verschlüsselung mit PHP

Sie können den Rest dieses Codes ganz nach Wunsch durch eine andere Verschlüsselungs-/Entschlüsselungsmethode ersetzen.