密码加密方式代码(密码加密方式代码是什么)

2023-01-31 3:28:32 密码用途 思思

php代码怎么加密最好,不能破解的那种

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

MD5

相信很多PHP开发者在最先接触PHP的时候,处理密码的首选加密函数可能就是MD5了,我当时就是这样的:

$password = md5($_POST["password"]);

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

SHA256 和 SHA512

其实跟前面的MD5同期的还有一个SHA1加密方式的,不过也是算法比较简单,所以这里就一笔带过吧。而这里即将要说到的SHA256 和 SHA512都是来自于SHA2家族的加密函数,看名字可能你就猜的出来了,这两个加密方式分别生成256和512比特长度的hash字串。

他们的使用方法如下:

?php

$password = hash("sha256", $password);

PHP内置了hash()函数,你只需要将加密方式传给hash()函数就好了。你可以直接指明sha256, sha512, md5, sha1等加密方式。

盐值

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

?php

function generateHashWithSalt($password) {$intermediateSalt = md5(uniqid(rand(), true));$salt = substr($intermediateSalt, 0, 6);

return hash("sha256", $password . $salt);}

Bcrypt

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

?php

function generateHash($password) {

if (defined("CRYPT_BLOWFISH") CRYPT_BLOWFISH) {$salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22);return crypt($password, $salt);

}

}

Bcrypt 其实就是Blowfish和crypt()函数的结合,我们这里通过CRYPT_BLOWFISH判断Blowfish是否可用,然后像上面一样生成一个盐值,不过这里需要注意的是,crypt()的盐值必须以$2a$或者$2y$开头,详细资料可以参考下面的链接:

更多资料可以看这里:

Hashing API

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

password_hash() – 对密码加密.

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

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

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

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

?php

$hash = password_hash($passwod, PASSWORD_DEFAULT);对,就是这么简单,一行代码,All done。

PASSWORD_DEFAULT目前使用的就是Bcrypt,所以在上面我会说推荐这个,不过因为Password Hashing API做得更好了,我必须郑重地想你推荐Password Hashing API。这里需要注意的是,如果你代码使用的都是PASSWORD_DEFAULT加密方式,那么在数据库的表中,password字段就得设置超过60个字符长度,你也可以使用PASSWORD_BCRYPT,这个时候,加密后字串总是60个字符长度。

这里使用password_hash()你完全可以不提供盐值(salt)和 消耗值 (cost),你可以将后者理解为一种性能的消耗值,cost越大,加密算法越复杂,消耗的内存也就越大。当然,如果你需要指定对应的盐值和消耗值,你可以这样写:

?php

$options = [

'salt' = custom_function_for_salt(), //write your own code to generate a suitable salt'cost' = 12 // the default cost is 10

];

$hash = password_hash($password, PASSWORD_DEFAULT, $options);密码加密过后,我们需要对密码进行验证,以此来判断用户输入的密码是否正确:

?php

if (password_verify($password, $hash)) {

// Pass

}

else {

// Invalid

}

很简单的吧,直接使用password_verify就可以对我们之前加密过的字符串(存在数据库中)进行验证了。

然而,如果有时候我们需要更改我们的加密方式,如某一天我们突然想更换一下盐值或者提高一下消耗值,我们这时候就要使用到password_needs_rehash()函数了:

?php

if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' = 12])) {// cost change to 12

$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' = 12]);// don't forget to store the new hash!

}

只有这样,PHP的Password Hashing API才会知道我们重现更换了加密方式,这样的主要目的就是为了后面的密码验证。

简单地说一下password_get_info(),这个函数一般可以看到下面三个信息:

algo – 算法实例

algoName – 算法名字

options – 加密时候的可选参数

所以,现在就开始用PHP 5.5吧,别再纠结低版本了。

Happy Hacking

双层加密摩斯码的求解方法有哪些?

双层加密摩斯码的求解方法:

第一层 70232834340

第二层708232834340

下面我简单说一下这四种常见密码形式。

栅栏易位法,恺撒移位密码,进制转换密码,摩尔斯密码。

栅栏易位法。

即把将要传递的信息中的字母交替排成上下两行,再将下面一行字母排在上面一行的后边,从而形成一段密码。

恺撒移位密码。

也就是一种最简单的错位法,将字母表前移或者后错几位,

例如:

明码表:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

密码表:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C

这就形成了一个简单的密码表,如果我想写frzy(即明文),那么对照上面密码表编成密码也就是iucb(即密文)了。密码表可以自己选择移几位,移动的位数也就是密钥。

进制转换密码。

比如给你一堆数字,乍一看头晕晕的,你可以观察数字的规律,将其转换为10进制数字,然后按照每个数字在字母表中的排列顺序,拼出正确字母。

摩尔斯密码。

翻译不同,有时也叫摩尔密码。*表示滴,-表示哒,如下表所示比如滴滴哒就表示字母U,滴滴滴滴滴就表示数字5。另外请大家不要被滴哒的形式所困,我们实际出密码的时候,有可能转换为很多种形式,例如用0和1表示,迷惑你向二进制方向考虑,等等。

摩尔斯是我们生活中非常常见的一种密码形式,例如电报就用的是这个哦。作为一种信息编码标准,莫尔斯电码拥有其他编码方案无法超越的长久的生命。莫尔斯电码在海事通讯中被作为国际标准一直使用到1999年。下图就是摩尔斯密码。

以上就是这四种常见的密码形式,希望我的回答能对你有所帮助。

画图说明序列密码的主要加密方式?

一、序列密码概述

序列密码也称为流密码(Stream Cipher),它是对称密码算法的一种。序列密码具有实现简单、便于硬件实施、加解密处理速度快、没有或只有有限的错误传播等特点,因此在实际应用中,特别是专用或机密机构中保持着优势,典型的应用领域包括无线通信、外交通信。

它的加密方式是将明文和密钥进行异或运算,如:明文a,ASCLL码为97,二进制嘛为0110 0001;密钥为B,ASCLL码为66,二进制码为0100 0010,然后再按位异或:

明文 0 1 1 0 0 0 0 1

密钥 0 1 0 0 0 0 1 0

密文 0 0 1 0 0 0 1 1

 

这样得到的密文为0010 0011,对应的ascll为35,即“#”。

当我们拿到密文“#”以及密钥“B”以后,我们同样按照转换为ASCLL码,按位异或的方式,获得明文:

密文 0 0 1 0 0 0 1 1

密钥 0 1 0 0 0 0 1 0

明文 0 1 1 0 0 0 0 1

 

这样,我们获得了“0110 0001”,转换为十进制为97,对应ASCLL表,得到了字符“a”。

二、序列密码的定义

这里我们对序列密码的加密与解密有以下定义:

明文、密文和密钥序列都是由单独的位组成,即:Xi,Yi,Si ∈{0,1}

加密:Yi = (Xi + Si) mod 2

解密:Xi = (Yi + Si) mod 2

三、序列密码的特点

序列密码如果使用统一密钥多次拦截后,可以从其中的规律中推导出密钥。1941-1946年间,苏联多次使用同一密码本以便节约成本,最后被美国破译,在美国称为Venona计划。为了让序列秘密更加安全,于是产生了一次性密钥,但是序列密码最大的问题有两点:

1.密钥长度与明文长度一致,如果需要加密20M的明文,那么就需要20M的密文

2.序列密码容易被篡改。

四、简单的序列密码解密

知道了序列密码的原理,解密过程就简单了,只需要将密文与密钥按字符依次取出,转换为ascll码,按位异或,再将其组合为字符串即可获得明文。

这里,因为存在特殊符号,我们就先去askll码表中,查到了每个符号对应的askll码,如下:

"11","9","43","43","44","6","49","41","21","2","56","39","1","47","20"

这样,我们就可以通过powershell,将密文进行解密了,代码如下:

[string[]]$a_arr ="11","9","43","43","44","6","49","41","21","2","56","39","1","47","20"

[string]$miyue="EfcDAcFFgilHeNm"

[int]$cd = $miyue.Length

[char[]]$b_arr = $miyue.ToCharArray()

[string]$e_arr =""

for($i=1;$i -le $cd; $i++ )

{

[int]$c = $b_arr[$i-1]

[int]$d = $c -bxor $a_arr[$i-1]

[char]$e = $d

[string]$e_arr =$e_arr + $e

}

echo $e_arr

登录后复制

输出的结果为:

这就完成了对序列密码的解密。

密码加密方式代码(密码加密方式代码是什么) 第1张