Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lưu trữ dữ liệu nhạy cảm trong Silverstripe 3.1

Những gì bạn có thể làm là tạo một Password DataObject với Member đối tượng có mối quan hệ từ một đến nhiều đối với Password sự vật. Bạn có thể sử dụng muối của Thành viên đã đăng nhập với chức năng mã hóa php 2 chiều để mã hóa và giải mã mật khẩu.

Mã ví dụ này sử dụng php mcrypt với muối thành viên để mã hóa và giải mã mật khẩu.

Lớp mật khẩu có mô tả, url, tên người dùng và mật khẩu. Nó chứa một hàm để mã hóa một chuỗi nhất định bằng cách sử dụng một khóa nhất định. Nó cũng chứa một chức năng giải mã để giải mã mật khẩu được lưu trữ bằng cách sử dụng muối thành viên được kết nối.

Lớp mật khẩu

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

}

Chúng ta cần mở rộng đối tượng Member để có mối quan hệ has_many với đối tượng Password:

MemberPasswordListExtension

<?php
class MemberPasswordListExtension extends DataExtension {

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

Điều này là cần thiết trong cấu hình của bạn để thêm tiện ích mở rộng:

_config.php

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

Sau đây là một biểu mẫu để thêm mật khẩu. Khi gửi, chúng tôi mã hóa mật khẩu bằng cách sử dụng muối thành viên và chức năng mã hóa từ lớp Mật khẩu.

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

...

Trong mẫu trang, chúng tôi gọi là Biểu mẫu và lặp qua các mật khẩu được lưu trong người dùng này. Chúng tôi hiển thị tên người dùng, mật khẩu được mã hóa và mật khẩu được giải mã, chỉ để cho chúng tôi thấy điều này đã hoạt động:

Mẫu trang.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 %>

...

Điều này sẽ cung cấp cho bạn cơ sở cho những gì bạn muốn làm và bạn có thể thay đổi nó theo nhu cầu của mình.

Phương pháp mã hóa được lấy từ câu trả lời stackoverflow này: Đơn giản nhất mã hóa hai chiều bằng PHP

Bạn có thể dễ dàng thay thế một phương pháp mã hóa / giải mã khác bằng phần còn lại của mã này nếu bạn muốn.



  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 ERROR 1005 (HY000):Không thể tạo bảng 'foo. # Sql-12c_4' (errno:150)

  2. Cách viết truy vấn HQL JOIN cho nhiều Cột đã chọn của bảng bằng cách sử dụng Khối mã lệnh trong Mệnh đề Chọn

  3. Thiết kế của cơ sở dữ liệu công cụ khuyến nghị?

  4. Làm cách nào để lấy dữ liệu trong bảng MySQL vào Java JTable?

  5. Nối kết quả từ một truy vấn vào cùng một hàng kết quả trong PostgreSQL - Redshift