sql >> データベース >  >> RDS >> Mysql

機密データをSilverstripe3.1に保存する

    あなたができることはPasswordを作成することです DataObject MemberPasswordと1対多の関係を持つオブジェクト 物体。ログインしたメンバーのソルトを双方向のphp暗号化機能で使用して、パスワードを暗号化および復号化できます。

    このサンプルコードでは、phpmcryptとメンバーsaltを使用して、パスワードを暗号化および復号化します。

    パスワードクラスには、説明、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オブジェクトを拡張して、Passwordオブジェクトとhas_manyの関係を持たせる必要があります:

    MemberPasswordListExtension

    <?php
    class MemberPasswordListExtension extends DataExtension {
    
        private static $has_many = array(
            'Passwords' => 'Password'
        );
    }
    

    これは、拡張機能を追加するために構成で必要です:

    _config.php

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

    以下は、パスワードを追加するためのフォームです。送信時に、メンバーソルトと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();
    }
    
    ...
    

    ページテンプレートでは、フォームを呼び出し、このユーザーの下に保存されているパスワードをループします。これが機能したことを示すために、ユーザー名、暗号化されたパスワード、および復号化されたパスワードを表示します。

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

    これにより、やりたいことの基盤が得られ、ニーズに合わせて変更できるようになります。

    暗号化方法は、次のスタックオーバーフローの回答から取得されました: Simplest PHPを使用した双方向暗号化

    必要に応じて、別の暗号化/復号化方法をこのコードの残りの部分に簡単に置き換えることができます。



    1. PHP:1つのmysql_queryステートメントで複数のSQLクエリ

    2. SecurityAdvisorMySQLアラートを修正する方法

    3. スクリプトでのMySQLトラフィックの暗号化

    4. MYSQLはサイズがGBの巨大なSQLファイルを挿入します