首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >最安全的用户登录系统

最安全的用户登录系统
EN

Stack Overflow用户
提问于 2012-02-25 02:57:12
回答 2查看 422关注 0票数 0

我正在开发网站,我正在尽我最大的努力来确保我有一个良好的安全系统。我将告诉你我做了什么,我还有另一个关于这个系统的问题。

1)我正在使用sha512方法来散列password.salt并将其保存在数据库中

2)我的盐是随机生成的,每个盐都是唯一的,我正在使用这个方法(在Yii框架中开发)

代码语言:javascript
复制
class Random extends CApplicationComponent
{
    public static function intRandom($min, $max) 
    {
        $bits = '';

        $diff = $max-$min;
        $bytes = ceil($diff/256);


        $fp = @fopen('/dev/urandom','rb');
        if ($fp !== FALSE) {
            $bits .= @fread($fp,$bytes);
            @fclose($fp);
        }
        $bitlength = strlen($bits);
        for ($i = 0; $i < $bitlength; $i++) {
            $int =  1+(ord($bits[$i]) % (($max-$min)+1));
        }
        return $int;
    }

    public static function strRandom($length) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_-+=|]}[{;:?.,></";   

        $size = strlen( $chars );
        for( $i = 0; $i < $length; $i++ ) {
            $str .= $chars[ self::intRandom(0, strlen($chars)-1) ];
        }

        return $str;
    }
}

3)用户登录后,我将生成新的盐并散列password.new_salt (当然每个盐都必须是唯一的)

代码语言:javascript
复制
        while ($record2 !== null){
            $salt = Random::strRandom(32);
            $record2 = User::model()->findByAttributes(array('salt'=>$salt));
        }
        $record->salt = $salt;
        $record->password = hash('sha512', $this->password.$salt);
        $record->save;

4)现在是时候在数据库中保存盐了,我正在使用Rijndael双向加密方法。mc_key位于php文件中,我每个月都会更换它。

代码语言:javascript
复制
function mc_encrypt($encrypt, $mc_key) {
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
    $passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($encrypt), MCRYPT_MODE_ECB, $iv));
    $encode = base64_encode($passcrypt);
    return $encode;
}

// Decrypt Function
function mc_decrypt($decrypt, $mc_key) {
    $decoded = base64_decode($decrypt);
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
    $decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($decoded), MCRYPT_MODE_ECB, $iv));
    return $decrypted;
}

那么,你怎么看?这足够了吗?或者我应该使用更多的东西?

我想,我做了黑客的噩梦,或者我只是另一个愚蠢的程序员,试图创造另一辆自行车。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-25 03:07:19

一个问题是普通的SHA512速度很快。您应该使用较慢的方法,如bcrypt

而且intRandom也很烂。如果我理解正确的话

  1. /dev/urandom不存在时,它会静默失败,而不是响亮地消失。
  2. $max-$min>=256的逻辑看起来完全损坏了
  3. 它的返回值不统一
票数 0
EN

Stack Overflow用户

发布于 2012-02-25 03:03:23

如果您正在寻找加密算法,您可能需要查看加密包1中的blowfish [CRYPT_BLOWFISH标志

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9436420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档