2

我正在建立一个私人网站,每个用户都有私人数据。我想为他们的内容提供良好的安全性。为此,我计划:

- 在站点范围内使用 SSL(站点不大,所以我想我会在站点范围内使用 ssl) - 我正在crypt()使用我的 codeigniter 配置加密密钥对用户密码进行哈希处理。

我想让用户能够选择他们的部分或全部私人帖子在数据库中进行加密。

我想让他们指定一个私钥,我将用它来加密帖子正文,然后将其插入数据库字段。我希望他们负责他们在哪里使用哪个密钥。他们可以使用一把钥匙,也可以选择使用不同的钥匙。

  • 关于帖子表列是否有任何特殊考虑?现在该字段创建为mediumtext utf8_unicode_ci.

  • 假设一个强大的 provacy 协议将配合 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 回答