2

各ユーザーがプライベート データを持つプライベート サイトを構築しています。彼らのコンテンツに適切なレベルのセキュリティを提供したいと考えています。これに向けて、次のことを計画しています。

- サイト全体で SSL を使用します (サイトは大きくないので、サイト全体で SSL を使用すると思います) crypt()- codeigniter 構成の暗号化キーを使用してユーザー パスワードをハッシュしています。

データベースで暗号化するプライベート投稿の一部またはすべてをユーザーが選択できるようにしたいと考えています。

投稿本文の暗号化に使用する秘密鍵を指定してから、データベース フィールドに挿入できるようにすることを考えています。どのキーをどこで使用するかについて責任を持ってもらいたいのです。1 つのキーを使用することも、別のキーを使用することも選択できます。

  • posts テーブル列に関して特別な考慮事項はありますか? これで、フィールドが として作成されましたmediumtext utf8_unicode_ci

  • 強力なプロバシー契約が SSL の使用を補完すると仮定すると、データが可能な限り安全であるという感覚をユーザーに提供するために他に何ができるでしょうか?

4

1 に答える 1

2

db フィールドは問題ありません。

使用できるunique encryption key for each user,ので、db のデータはそのキーによって暗号化されます。long unique hash

次に、2 つの分離されたデータベース (テーブルではない) を使用できます。

1db for users encryption keys

1db for users data encrypted by keys

次に、encrypt/decrypt libraryどの用途を使用AESしているかを共有します。これは、私が見つけた最高のものです。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * Crypto encrypt/decrypt Class it uses AES by $secret_key
 *
 * @access    public
 * @param     array/value
 * @return    array/value
 */
class Crypto(){

    function encrypt($data,$secret_key){
        $array = array();

        if(is_array($data)){
            foreach($data as $key=>$value){
                 $array[$key] = trim(
            base64_encode(
                mcrypt_encrypt(
                    MCRYPT_RIJNDAEL_256,
                    $secret_key, $value, 
                    MCRYPT_MODE_ECB, 
                    mcrypt_create_iv(
                        mcrypt_get_iv_size(
                            MCRYPT_RIJNDAEL_256, 
                            MCRYPT_MODE_ECB
                            ), 
                        MCRYPT_RAND)
                    )
                )
            );
            }
            return $array;

        }else{

           return trim(
            base64_encode(
                mcrypt_encrypt(
                    MCRYPT_RIJNDAEL_256,
                    $secret_key, $data, 
                    MCRYPT_MODE_ECB, 
                    mcrypt_create_iv(
                        mcrypt_get_iv_size(
                            MCRYPT_RIJNDAEL_256, 
                            MCRYPT_MODE_ECB
                            ), 
                        MCRYPT_RAND)
                    )
                )
            );
       }
   }



   function decrypt($data,$secret_key)
   {
    $array = array();

        if(is_array($data)){
            foreach($data as $key=>$value){
                 $array[$key] = trim(
            mcrypt_decrypt(
                MCRYPT_RIJNDAEL_256, 
                $secret_key, 
                base64_decode($value), 
                MCRYPT_MODE_ECB,
                mcrypt_create_iv(
                    mcrypt_get_iv_size(
                        MCRYPT_RIJNDAEL_256,
                        MCRYPT_MODE_ECB
                        ), 
                    MCRYPT_RAND
                    )
                )
            );
            }
            return $array;
        }else{
        return trim(
            mcrypt_decrypt(
                MCRYPT_RIJNDAEL_256, 
                $sSecretKey, 
                base64_decode($sValue), 
                MCRYPT_MODE_ECB,
                mcrypt_create_iv(
                    mcrypt_get_iv_size(
                        MCRYPT_RIJNDAEL_256,
                        MCRYPT_MODE_ECB
                        ), 
                    MCRYPT_RAND
                    )
                )
            );
    }
}


}
//end class Crypto

注: $secret_keyはユーザー キーで$dataあり、暗号化または復号化するデータです。

于 2013-04-04T09:15:53.130 に答える