Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Simpan data sensitif di Silverstripe 3.1

Yang dapat Anda lakukan adalah membuat Password DataObject dengan Member objek yang memiliki hubungan satu ke banyak dengan Password obyek. Anda dapat menggunakan garam dari Anggota yang masuk dengan fungsi enkripsi php 2 arah untuk mengenkripsi dan mendekripsi kata sandi.

Kode contoh ini menggunakan php mcrypt dengan garam anggota untuk mengenkripsi dan mendekripsi kata sandi.

Kelas kata sandi memiliki deskripsi, url, nama pengguna, dan kata sandi. Ini berisi fungsi untuk mengenkripsi string yang diberikan menggunakan kunci yang diberikan. Ini juga berisi fungsi dekripsi untuk mendekripsi kata sandi yang disimpan menggunakan garam anggota yang terhubung.

Kelas sandi

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

}

Kita perlu memperluas objek Anggota untuk memiliki hubungan has_many dengan objek Kata Sandi:

MemberPasswordListExtension

<?php
class MemberPasswordListExtension extends DataExtension {

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

Ini diperlukan dalam konfigurasi Anda untuk menambahkan ekstensi:

_config.php

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

Berikut ini adalah form untuk menambahkan password. Saat pengiriman, kami mengenkripsi kata sandi menggunakan garam anggota dan fungsi enkripsi dari kelas Kata Sandi.

Pengontrol_Halaman

...

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

...

Di templat halaman, kami memanggil Formulir dan mengulang kata sandi yang disimpan di bawah pengguna ini. Kami menampilkan nama pengguna, kata sandi terenkripsi, dan kata sandi yang didekripsi, hanya untuk menunjukkan kepada kami bahwa ini berhasil:

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

...

Ini akan memberi Anda dasar untuk apa yang ingin Anda lakukan, dan Anda harus dapat mengubahnya sesuai kebutuhan Anda.

Metode enkripsi diambil dari jawaban stackoverflow ini:Sederhana enkripsi dua arah menggunakan PHP

Anda dapat dengan mudah mengganti metode enkripsi/dekripsi yang berbeda dengan sisa kode ini sesuai keinginan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara melakukan pencarian aksen dan case-insensitive di database MediaWiki?

  2. Koneksi dinamis ke database MySQL kedua di Ruby on Rails

  3. Masalah dengan tampilan data MySQL di studio android menggunakan voli

  4. Dapatkan semua catatan dari database MySQL yang ada di dalam Google Maps .getBounds?

  5. Kapan menggunakan model partisi mysql yang mana?