Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Przechowuj wrażliwe dane w Silverstripe 3.1

Możesz stworzyć Password DataObject z Member obiekt mający związek jeden do wielu z Password obiekt. Możesz użyć soli zalogowanego członka z dwukierunkową funkcją szyfrowania php, aby zaszyfrować i odszyfrować hasło.

Ten przykładowy kod używa mcrypt php z solą członka do zaszyfrowania i odszyfrowania hasła.

Klasa hasła ma opis, adres URL, nazwę użytkownika i hasło. Zawiera funkcję do zaszyfrowania danego ciągu za pomocą danego klucza. Zawiera również funkcję odszyfrowywania, która umożliwia odszyfrowanie przechowywanego hasła za pomocą połączonej soli członkowskiej.

Klasa hasła

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

}

Musimy rozszerzyć obiekt Member, aby miał związek has_many z obiektem Password:

MemberPasswordListExtension

<?php
class MemberPasswordListExtension extends DataExtension {

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

Jest to potrzebne w Twojej konfiguracji, aby dodać rozszerzenie:

_config.php

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

Poniżej znajduje się formularz do dodania hasła. Po przesłaniu szyfrujemy hasło za pomocą soli członkowskiej i funkcji szyfrowania z klasy Password.

Kontroler strony

...

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

...

W szablonie strony wywołujemy Form i przechodzimy przez hasła zapisane pod tym użytkownikiem. Wyświetlamy nazwę użytkownika, zaszyfrowane hasło i odszyfrowane hasło, aby pokazać nam, że to zadziałało:

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

...

Powinno to dać Ci podstawę do tego, co chcesz zrobić, i powinieneś być w stanie dostosować to do swoich potrzeb.

Metoda szyfrowania została zaczerpnięta z tej odpowiedzi na stackoverflow:Najprostsza szyfrowanie dwukierunkowe przy użyciu PHP

Możesz łatwo zastąpić inną metodę szyfrowania/odszyfrowywania resztą tego kodu, jeśli chcesz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy użycie LIMIT 1 przyspiesza zapytanie o klucz podstawowy?

  2. Uzyskać nowy identyfikator klucza podstawowego rekordu z zapytania wstawiającego MySQL?

  3. SQL:Jak możemy zrobić table1 JOIN table2 ON do tabeli podanej w polu w table1?

  4. Jak radzić sobie z częściowymi datami (2010-00-00) z MySQL w Django?

  5. gdzie jest błąd w moim kodzie sql?