password_hash(password_hash 算法)

http://www.itjxue.com  2023-02-23 02:57  来源:未知  点击次数: 

Laravel 5.2 默认的密码加密,怎么加点盐?

查看这部分的源代码可得,

// Laravel 的 bcrypt 就是

$hash = password_hash($value, PASSWORD_BCRYPT, ['cost' = 10]);

因为 password_hash 使用的是 crypt 算法, 因此参与计算 hash值的:

算法(就像身份证开头能知道省份一样, 由盐值的格式决定), cost(默认10) 和 盐值 是在$hash中可以直接看出来的!

所以说, Laravel 中bcrypt的盐值是PHP自动随机生成的字符, 虽然同一个密码每次计算的hash不一样.

但是通过 $hash 和 密码, 却可以验证密码的正确性!

具体来说, 比如这个

$hash = password_hash('password',PASSWORD_BCRYPT,['cost' = 10]);

echo $hash;

// 比如我这次算的是

// $hash = '$2y$10$DyAJOutGjURG9xyKgAaCtOm4K1yezvgNkxHf6PhuLYBCENk61bePm';

那么我们从这个 crypt的hash值中可以看到,

因为以$2y$开头, 所以它的算法是 CRYPT_BLOWFISH .

同时 CRYPT_BLOWFISH 算法盐值格式规定是 :

以$2y$开头 + 一个两位cost参数 + $ + 22位随机字符("./0-9A-Za-z")

$hash(CRYPT_BLOWFISH是固定60位) = 盐值 + 31位单向加密后的值

ansible-创建、删除用户

2020-10-29

通过创建yaml文件创建用户,playbook模式,编写useradd.yaml写入以下内容(注意格式,该对齐的地方要对齐,要不然会报错)

- hosts: test? #组名

? tasks:

? ? - name: create user

? ? ? user:

? ? ? ? name: "{{ item.user }}"

? ? ? ? password: "{{ 'item.pass' | password_hash('sha512') }}"? ? #采用哈希加密

? ? ? ? state: present

? ? ? loop:

? ? ? ? - { user: user1, pass: 123}

? ? ? ? - { user: user2, pass: 456}

? ? ? ? - { user: user3, pass: 789}

执行:[root@docker lxt]# ansible-playbook useradd.yml

#######################并没有什么卵用的分割线######################

批量删除用户,步骤同上,编辑一个userdel.yaml文件

- hosts: test

? ?tasks:

? ? - name: delete user

? ? ? user:

? ? ? ? name: "{{ item.user }}"

? ? ? ? password: "{{ 'item.pass' | password_hash('sha512') }}"? ? #采用哈希加密

? ? ? ? state: absent? #缺少

? ? ? ? remove: yes

? ? ? loop:

? ? ? ? - { user: user1}

? ? ? ? - { user: user2}

? ? ? ? - { user: user3}

执行:[root@docker lxt]# ansible-playbook userdel.yml

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

ansible模板等使用方法

==============================================================

ansible 主机信息(可以是组) -m 模块名称 -a "完成动作"

举例:

在ansible中 使用ansible-doc 模块名称 来查看单独模块用法

常用参数

官方模块说明:

参数:chdir--在执行命令操作前进行切换目录

参数:creates--判断一个文件是否存在,如果存在后面的命令就不会执行

参数:removes--判断一个文件是否存在,如果不存在,后续的命令不会被执行

官方模块说明:

参数chdir:在执行命令前进行目录切换

参数:creates----判断一个文件是否存在,如果存在,后续命令不会执行

参数:removes--判断一个文件是否存在,如果不存在则候命的命令不会执行

官网模块说明:

使用这个模块需要注意的

官方模块说明:

参数:name--指定安装软件的名称

参数:state--指定软件安装或卸载

在这个模块中卸载使用 removed 安装使用installed;注意看示例

官网模块说明:

官网模块说明:

参数:src--指定管理端源数据

参数:dest--分发到远程主机的目标路径下

参数:owner--专属文件之后修改文件属主

参数:group--传输文件之后修改文件属组

参数:mode--修改文件的读、写、执行权限

参数:backup--在分发传输文件之前,将源文件进行备份,按照时间信息进行备份

参数remote_src--no表示从管理端找寻数据进行分发;yes 默认从被管理端找寻数据进行分发

参数content--分发文件时在文件中穿件简单信息

官网模块说明:

参数:src--要拉取的远程数据

参数:dest--要保存本地的文件路径

官方说明:

path:指定路径信息

owner:传输文件之后修改文件属主权限

group:传输文件后修改属组权限

mode:直接修改文件读、写、执行权限

state:touch(创建文件)、directory(创建目录)、hard(创建硬链接文件) link(创建软链接文件)、absent(删除数据)

创建件目录:

创建文件:

删除数据信息:

官方说明:

参数:src--指定要挂载数据

参数:path--指定挂载点

**参数:fstype--指定挂载后,文件系统类型 如:ext3、ext4、xfs、nfs **

参数:state--指定动作 如:mounted(挂载)、present(永久挂载)、umounted(临时卸载) absent(永久卸载)

挂载:

官方说明:

name: 定义定时任务注释信息

参数:minute --表示分钟信息

参数:hour --表示小时信息

参数:day --表示日期信息

参数:month --表示月份信息

参数:weekday --表示星期信息

参数:job --表示定义任务信息

参数:state --指定动作 如:present(创建定时任务)、absent(删除定时任务)

参数:disabled: 让定时任务临时失效

利用ansible编写时间同步定时任务:每隔5分钟,进行时间同步:

删除定时任务:

注释定时任务:

官网说明:

参数:name--指点组名

参数:gid--指定gid

参数:state--指定动作 present(创建) absent(删除)

官方说明:

参数:name--指定用户名称

参数:uid--指定用户uid信息

参数:group--指定属组

参数:groups--指定属于附加组

参数:password—-指定用户密码信息(必须密文的信息)

参数:shell—-指定用户shell信息 /sbin/nologin

参数:create_home--no表示不创建家目录

创建用户:

删除用户:

**方法一:利用ansible模块功能

ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}"

mypassword: 指定明文密码信息

mysecretsalt:加密计算方式(辅助加密)

方法二:利用python模块功能

使用这种方法需要安装python-pip

如果安装不上需要更新pip源,更新方法:

更新pip源:

==============================================================

Linux

php password 怎么使用

这样试试呢我在后盾人看视频时看见老师讲这个问题的php5.5提供的Password Hashing API就能很好的解决这些问题。

我们先来看password_hash()函数:

string password_hash ( string $password , integer $algo [, array $options ])

它有三个参数:密码、哈希算法、选项。前两项为必须的。

让我们使用password_hash()简单的创建一个哈希密码:

$pwd = "123456";

$hash = password_hash($pwd, PASSWORD_DEFAULT);

echo $hash;

上例输出结果类似:$2y$10$4kAu4FNGuolmRmSSHgKEMe3DbG5pm3diikFkiAKNh.Sf1tPbB4uo2

并且刷新页面该哈希值也会不断的变化。

哈希值创建完毕,我们可以用password_verify()来校验密码是否和哈希值匹配:

boolean password_verify ( string $password , string $hash )

它接收2个参数:密码和哈希值,并返回布尔值。检查之前生成的哈希值是否和密码匹配:

if (password_verify($pwd,'$2y$10$4kAu4FNGuolmRmSSHgKEMe3DbG5pm3diikFkiAKNh.Sf1tPbB4uo2')) {

echo "密码正确";

} else {

echo "密码错误";

}

基本上使用以上这2个函数就能安全的创建和校验hash密码了,还有另外2个API函数:

password_get_info() //查看哈希值的相关信息

password_needs_rehash() //检查一个hash值是否是使用特定算法及选项创建的,希望对你有用,(〃???〃)

PHP常用加密解密方法

作者/上善若水

1.md5(string $str,bool $flag = false);

$flag = false 默认返回32位的16进至数据散列值

$flag = true ?返回原始流数据

2.sha1($string,$flag = false)

$flag = false 默认返回40位的16进至数据散列值

true ?返回原始流数据

3.hash(string $algo,srting $str,bool $flag);

$algo : 算法名称,可通过hash_algos()函数获取所有hash加密的算法

如:md5,sha1等,采用md5,sha1加密所得结果和1,2两种方式结 果相同。

$flag = false 默认返回16进至的数据散列值,具体长度根据算法不同

而不同。

true ?返回原始流数据。

4.crypt(string $str,$string $salt);

函数返回使用 DES、Blowfish 或 MD5 算法加密的字符串。

具体算法依赖于PHP检查之后支持的算法和$salt的格式和长度,当 然具体结果也和操作系统有关。比较结果采用 hash_equals($crypted,crypt($input,$salt));//且salt值相同

Password_verify($str,$crypted);

5.password_hash ( string $str, integer $algo [, array $options ] )

函数返回哈希加密后的密码字符串, password_hash() 是crypt()的 一个简单封装

$algo : 算法 PASSWORD_DEFAULT ,PASSWORD_BCRYPT

$options = [

“cost”=10,//指明算法递归的层数,

“salt”=“xxadasdsad”//加密盐值,即将被遗 弃,采用系统自动随机生成安全性更高

];

使用的算法、cost 和盐值作为哈希的一部分返回

Password_verify($str,$hashed);

6.base64_encode(string $str)

设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层 传输,例如电子邮件的主体。base64_decode(string $encoded)

可以进行解码;

7.mcrypt_encrypt ( string $cipher , string $key , string $data ,

string $mode [, string $iv ] )

mcrypt_decrypt ( string $cipher , string $key , string $crypted ,

string $mode [, string $iv ] )

$ciper:加密算法,mcrypt_list_algorithms()可以获取该函数所有支持的算法

如MCRYPT_DES(“des”),MCRYPT_RIJNDAEL_128(“rijndael-128”);

$mode : 加密模式 ,mcrypt_list_modes()获取所有支持的加密模式,ecb,cbc

$key: 加密的秘钥,mcrypt_get_key_size ( string $cipher , string $mode )

获取指定的算法和模式所需的密钥长度。$key要满足这个长度,如果长 度无效会报出警告。

$iv : 加密的初始向量,可通过mcrypt_create_iv ( int $size [, int $source = MCRYPT_DEV_URANDOM ] ),

Iv的参数size:

通过mcrypt_get_iv_size ( string $cipher , string $mode )获取

Iv 的参数source:

初始向量数据来源。可选值有: MCRYPT_RAND (系统随机数生成 器), MCRYPT_DEV_RANDOM (从 /dev/random 文件读取数据) 和 ?MCRYPT_DEV_URANDOM (从 /dev/urandom 文件读取数据)。 在 Windows 平台,PHP 5.3.0 之前的版本中,仅支持 MCRYPT_RAND。

请注意,在 PHP 5.6.0 之前的版本中, 此参数的默认值 为 MCRYPT_DEV_RANDOM。

Note: 需要注意的是,如果没有更多可用的用来产生随机数据的信息, 那么 MCRYPT_DEV_RANDOM 可能进入阻塞状态。

$data : 要加密的字符串数据

(责任编辑:IT教学网)

更多

相关Windows服务器文章

推荐Windows服务器文章