Mysql
 sql >> база данни >  >> RDS >> Mysql

Съхранявайте чувствителни данни в Silverstripe 3.1

Това, което бихте могли да направите, е да създадете Password DataObject с Member обект, имащ връзка едно към много с Password обект. Можете да използвате солта на влезлия член с функция за двупосочно php шифроване, за да шифровате и дешифрирате парола.

Този примерен код използва php mcrypt със солта на членовете за криптиране и дешифриране на паролата.

Класът парола има описание, url, потребителско име и парола. Той съдържа функция за криптиране на даден низ с помощта на даден ключ. Той също така съдържа функция за декриптиране за дешифриране на съхранената парола с помощта на солта на свързания член.

Клас парола

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

}

Трябва да разширим обекта Member, за да имаме връзка has_many с обекта Password:

MemberPasswordListExtension

<?php
class MemberPasswordListExtension extends DataExtension {

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

Това е необходимо във вашата конфигурация, за да добавите разширението:

_config.php

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

Следва формуляр за добавяне на парола. При подаване ние криптираме паролата, използвайки солта за членове и функцията за шифроване от класа Password.

Контролер на страница

...

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

...

В шаблона на страницата извикваме формуляра и преглеждаме паролите, запазени под този потребител. Показваме потребителското име, криптираната парола и дешифрираната парола, само за да ни покаже, че това работи:

Шаблон 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 %>

...

Това трябва да ви даде база за това, което искате да правите, и трябва да можете да го промените според нуждите си.

Методът за криптиране е взет от този отговор на stackoverflow:Най-простият двупосочно криптиране с помощта на PHP

Можете лесно да замените различен метод за криптиране/декриптиране с останалата част от този код, както желаете.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. КОЛОНА ИЗПУСКАНЕ на MySQL

  2. Свързване към отдалечена база данни от локален хост компютър с помощта на mysql и PHP

  3. Моето приложение осъществява достъп до отдалечена база данни. Как да провеждам ефективно модулни тестове?

  4. Mysql DateTime група с 15 минути

  5. SELECT LAST_INSERT_ID() връща 0 след използване на подготвен израз