1

機密情報 (主にパスワード) をシルバーストライプのデータオブジェクトに保存したいと考えています。データは暗号化してデータベースに保存する必要があります。テンプレートでこのフィールドを呼び出す場合、データを復号化する必要があります。

しかし、これを行う方法がわかりません。誰かが私を正しい方向に向けることができますか?

どうも!

4

2 に答える 2

2

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

このコード例では、php mcrypt をメンバー 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))));
    }

}

Password オブジェクトと has_many 関係を持つように Member オブジェクトを拡張する必要があります。

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

...

これにより、やりたいことのベースが得られ、必要に応じて変更できるはずです。

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

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

于 2013-10-02T12:22:10.873 に答える
1

デフォルトでは、Silverstripe 3.x は Blowfish を使用して不可逆的なソルト付きハッシュでパスワードを保存します。別の PasswordEncryptor クラスを記述して、他の動作を処理できます。framework/security/PasswordEncryptor.phpこれがどのように行われるかの例については、 のさまざまなクラスを参照してください。PasswordEncryptor_Custom.php を独自のコードベース (つまり mysite/) のどこかに実装し、すべての関数を再実装します。

これは非常に非典型的であり、セキュリティのベスト プラクティスに反することに注意してください。一般的な経験則として、平文のパスワードを誰にも公開しないでください。可逆パスワード暗号化は本質的に安全ではありません。これは、1 つのプレーンテキスト パスワード (ユーザーのパスワード) を別のプレーンテキスト キー (プレーンテキスト キー) に効果的に置き換えているためです。別のハッシュを使用してパスワードを単純にリセットすることをお勧めします。

于 2013-09-30T00:05:13.513 に答える