Mysql
 sql >> Base de données >  >> RDS >> Mysql

Stockez les données sensibles dans Silverstripe 3.1

Ce que vous pourriez faire est de créer un Password DataObject avec le Member objet ayant une relation un à plusieurs avec le Password objet. Vous pouvez utiliser le sel du membre connecté avec une fonction de cryptage php à 2 voies pour crypter et décrypter un mot de passe.

Cet exemple de code utilise php mcrypt avec le membre salt pour chiffrer et déchiffrer le mot de passe.

La classe de mot de passe a une description, une URL, un nom d'utilisateur et un mot de passe. Il contient une fonction pour chiffrer une chaîne donnée à l'aide d'une clé donnée. Il contient également une fonction de déchiffrement pour déchiffrer le mot de passe stocké à l'aide du sel de membre connecté.

Classe de mot de passe

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

}

Nous devons étendre l'objet Member pour avoir une relation has_many avec l'objet Password :

Extension de la liste des mots de passe des membres

<?php
class MemberPasswordListExtension extends DataExtension {

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

Ceci est nécessaire dans votre configuration pour ajouter l'extension :

_config.php

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

Voici un formulaire pour ajouter un mot de passe. Lors de la soumission, nous chiffrons le mot de passe à l'aide du membre salt et de la fonction de cryptage de la classe 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();
}

...

Dans le modèle de page, nous appelons le formulaire et parcourons les mots de passe enregistrés sous cet utilisateur. Nous affichons le nom d'utilisateur, le mot de passe crypté et le mot de passe décrypté, histoire de nous montrer que cela a fonctionné :

Modèle 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 %>

...

Cela devrait vous donner une base pour ce que vous voulez faire, et vous devriez pouvoir l'adapter à vos besoins.

La méthode de chiffrement a été tirée de cette réponse stackoverflow :La plus simple chiffrement bidirectionnel à l'aide de PHP

Vous pouvez facilement substituer une autre méthode de cryptage/décryptage avec le reste de ce code comme vous le souhaitez.