注册 登陆

    2018-12-05 21:46:06在PHP开发中,你会用哪一种加密的方法?

    您现在的位置是: 首页 >  php >  在PHP开发中,你会用哪一种加密的方法?



    在使用PHP开发Web应用的中,很多的应用都会要求用户注册,而注册的时候就需要我们对用户的信息进行处理了,最常见的莫过于就是邮箱和密码了,本文意在讨论对密码的处理:也就是对密码的加密处理。


    相信最开始php开发者接触php的时候,处理密码的首选就是md5了,例如这样: 

    // md5加密
    $str  = 123546;
    $rand = mt_rand(1111,9999);
    
    $md51 = md5($str);
    $md52 = md5(md5($str));
    $md53 = '###' . md5(md5($rand . $str));
    
    //print_r($md51);
    //print_r($md52);
    //print_r($md53);


    然而MD5的加密方式目前在PHP中貌似不太受欢迎了,因为它的加密算法实在是显得有点简单了,而且很多破解密码的站点都存放了很多经过MD5加密的密码字符串,所以这里我是非常不提倡还在单单使用MD5来加密用户的密码的。


    php 自带的可逆转的加密为:base64_encode()、urlencode() 相对应的解密函数:base64_decode() 、urldecode() ,如下:

    $str = 123456;
    // base64_encode() 加密
    $base64encode=base64_encode($str);
    echo 'base64_encode加密后的结果为:'.$base64encode.'<br>';
    // base64_decode()解密
    echo 'base64_decode解密后的结果为:'.base64_decode($base64encode).'<br>';
    // urlencode() 加密
    $urlencode=urlencode($str);
    echo 'urlencode加密后的结果为:'.$urlencode.'<br>';
    // urldecode() 解密
    echo 'urldecode解密后的结果为:'.urldecode($urlencode).'<br>';



    在加密的过程,我们还有一个非常常见的小伙伴:盐值。对,我们在加密的时候其实会给加密的字符串添加一个额外的字符串,以达到提高一定安全的目的:

    // hash
    function generateHashWithSalt($password) {
        $intermediateSalt = md5(uniqid(rand(), true));
        $salt = substr($intermediateSalt, 0, 6);
        return hash("sha256", $password . $salt);
    }


    如果让我来建议一种加密方式的话,Bcrypt可能是我给你推荐的最低要求了,因为我会强烈推荐你后面会说到的Hashing API,不过Bcrypt也不失为一种比较不错的加密方式了。

    // Bcrypt  Blowfish和crypt()函数的结合
    //crypt()的盐值必须以$2a$或者$2y$开头
    function generateHash($password) {
        if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
            $salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22);
            return crypt($password, $salt);
        }
    }
    
    print_r(generateHash(123456));

    这里才是我们的重头戏,Password Hashing API是PHP 5.5之后才有的新特性,它主要是提供下面几个函数供我们使用:


    #password_hash() – 对密码加密.

    #password_verify() – 验证已经加密的密码,检验其hash字串是否一致.

    #password_needs_rehash() – 给密码重新加密.

    #password_get_info() – 返回加密算法的名称和一些相关信息.


    虽然说crypt()函数在使用上已足够,但是password_hash()不仅可以使我们的代码更加简短,而且还在安全方面给了我们更好的保障,所以,现在PHP的官方都是推荐这种方式来加密用户的密码,很多流行的框架比如Laravel就是用的这种加密方式。

    // Password Hashing API
    $password = 123456;
    // 加密密码
    $hash = password_hash($password, PASSWORD_DEFAULT);
    
    //验证密码
    if (password_verify($password,$hash)) {
       echo '密码是正确的';
    } else {
       echo '密码错误的!';
    }
    print_r($hash);


    AES加密

    之前公司也有用到aes加密。

    AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;是一个可逆的加密方式,同md5不同。

     AES分为几种模式,比如ECB,CBC,CFB等等,这些模式除了ECB由于没有使用IV而不太安全,其他模式差别并没有太明显,大部分的区别在IV和KEY来计算密文的方法略有区别。

    iv的作用?

     IV称为初始向量,不同的IV加密后的字符串是不同的,加密和解密需要相同的IV,既然IV看起来和key一样,却还要多一个IV的目的,对于每个块来说,key是不变的,但是只有第一个块的IV是用户提供的,其他块IV都是自动生成。 

      IV的长度为16字节。超过或者不足,可能实现的库都会进行补齐或截断。但是由于块的长度是16字节,所以一般可以认为需要的IV是16字节。有想详细了解aes加密的小伙伴,可以网上查阅下,封装好的加密解密类都是有的。


关键字词: php加密方式

0
Name::

Email:


留言内容: