password_hash(password_hash 算法)
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 : 要加密的字符串数据