- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PHP中的多种加密技术及代码示例解析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以 从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法.
信息加密技术的分类 。
单项散列加密技术(不可逆的加密) 。
属于摘要算法,不是一种加密算法,作用是把任意长的输入字符串变化成固定长的输出串的一种函数 。
MD5 。
string md5 ( string $str [, bool $raw_output = false ] ); //MD5加密,输入任意长度字符串返回一个唯一的32位字符 。
md5()为单向加密,没有逆向解密算法,但是还是可以对一些常见的字符串通过收集,枚举,碰撞等方法破解;所以为了让其破解起来更麻烦一些,所以我们一般加一点盐值(salt)并双重MD5,
md5(md5($password).'sdva'),
sdva就是盐值,该盐值应该是随机的,比如md5常用在密码加密上,所以在注册的时候我会随机生成这个字符串,然后通过上面的方法来双重加密一下,
Crypt 。
很少看到有人用这个函数,如果要用的话有可能是用在对称或非对称的算法里面,了解一下既可,
string crypt ( string $str [, string $salt ] ) //第一个为需要加密的字符串,第二个为盐值(就是加密干扰值,如果没有提供,则默认由PHP自动生成);返回散列后的字符串或一个少于 13 字符的字符串,后者为了区别盐值 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<?php
$password
=
'testtest.com'
;
echo
crypt(
$password
);
//输出:$1$DZ3.QX2.$CQZ8I.OfeepKYrWp0oG8L1
/*第二个$与第三个$之间的八个字符是由PHP生成的,每刷新一次就变一次
*/
echo
"<hr>"
;
echo
crypt(
$password
,
"testtest"
);
//输出:tesGeyALKYm3A
//当我们要加自定义的盐值时,如例子中的testtest作为第二个参数直接加入, 超出两位字符的会截取前两位
echo
"<hr>"
;
echo
crypt(
$password
,
'$1$testtest$'
);
//输出:$1$testtest$DsiRAWGTHiVH3O0HSHGoL1
/*crypt加密函数有多种盐值加密支持,以上例子展示的是MD5散列作为盐值,该方式下
盐值以$1$$的形式加入,如例子中的testtest加在后两个$符之间,
超出八位字符的会截取前八位,总长为12位;crypt默认就是这种形式。
*/
echo
"<hr>"
;
//crypt还有多种盐值加密支持,详见手册
Sha1加密:
string sha1 ( string
$str
[, bool
$raw_output
= false ]);
//跟md5很像,不同的是sha1()默认情况下返回40个字符的散列值,传入参数性质一样,第一个为加密的字符串,第二个为raw_output的布尔值,默认为false,如果设置为true,sha1()则会返回原始的20 位原始格式报文摘要
<?php
$my_intro
=
"zhouxiaogang"
;
echo
sha1(
$my_intro
);
// b6773e8c180c693d9f875bcf77c1202a243e8594
echo
"<hr>"
;
//当然,可以将多种加密算法混合使用
echo
md5(sha1(
$my_intro
));
//输出:54818bd624d69ac9a139bf92251e381d
//这种方式的双重加密也可以提高数据的安全性
|
非对称加密 。
非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥),
如图所示,甲乙之间使用非对称加密的方式完成了重要信息的安全传输.
在传输过程中,即使攻击者截获了传输的密文,并得到了乙的公钥,也无法破解密文,因为只有乙的私钥才能解密密文 。
同样,如果乙要回复加密信息给甲,那么需要甲先公布甲的公钥给乙用于加密,甲自己保存甲的私钥用于解密.
在非对称加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。 其中我们最见的算法是RSA算法 。
以下是从网上摘抄的一段PHP通过openssl实现非对称加密的算法 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
<?php
/**
* 使用openssl实现非对称加密
* @since 2010-07-08
*/
class
Rsa {
/**
* private key
*/
private
$_privKey
;
/**
* public key
*/
private
$_pubKey
;
/**
* the keys saving path
*/
private
$_keyPath
;
/**
* the construtor,the param $path is the keys saving path
*/
public
function
__construct(
$path
) {
if
(emptyempty(
$path
) || !
is_dir
(
$path
)) {
throw
new
Exception(
'Must set the keys save path'
);
}
$this
->_keyPath =
$path
;
}
/**
* create the key pair,save the key to $this->_keyPath
*/
public
function
createKey() {
$r
= openssl_pkey_new();
openssl_pkey_export(
$r
,
$privKey
);
file_put_contents
(
$this
->_keyPath . DIRECTORY_SEPARATOR .
'priv.key'
,
$privKey
);
$this
->_privKey = openssl_pkey_get_public(
$privKey
);
$rp
= openssl_pkey_get_details(
$r
);
$pubKey
=
$rp
[
'key'
];
file_put_contents
(
$this
->_keyPath . DIRECTORY_SEPARATOR .
'pub.key'
,
$pubKey
);
$this
->_pubKey = openssl_pkey_get_public(
$pubKey
);
}
/**
* setup the private key
*/
public
function
setupPrivKey() {
if
(
is_resource
(
$this
->_privKey)) {
return
true;
}
$file
=
$this
->_keyPath . DIRECTORY_SEPARATOR .
'priv.key'
;
$prk
=
file_get_contents
(
$file
);
$this
->_privKey = openssl_pkey_get_private(
$prk
);
return
true;
}
/**
* setup the public key
*/
public
function
setupPubKey() {
if
(
is_resource
(
$this
->_pubKey)) {
return
true;
}
$file
=
$this
->_keyPath . DIRECTORY_SEPARATOR .
'pub.key'
;
$puk
=
file_get_contents
(
$file
);
$this
->_pubKey = openssl_pkey_get_public(
$puk
);
return
true;
}
/**
* encrypt with the private key
*/
public
function
privEncrypt(
$data
) {
if
(!
is_string
(
$data
)) {
return
null;
}
$this
->setupPrivKey();
$r
= openssl_private_encrypt(
$data
,
$encrypted
,
$this
->_privKey);
if
(
$r
) {
return
base64_encode
(
$encrypted
);
}
return
null;
}
/**
* decrypt with the private key
*/
public
function
privDecrypt(
$encrypted
) {
if
(!
is_string
(
$encrypted
)) {
return
null;
}
$this
->setupPrivKey();
$encrypted
=
base64_decode
(
$encrypted
);
$r
= openssl_private_decrypt(
$encrypted
,
$decrypted
,
$this
->_privKey);
if
(
$r
) {
return
$decrypted
;
}
return
null;
}
/**
* encrypt with public key
*/
public
function
pubEncrypt(
$data
) {
if
(!
is_string
(
$data
)) {
return
null;
}
$this
->setupPubKey();
$r
= openssl_public_encrypt(
$data
,
$encrypted
,
$this
->_pubKey);
if
(
$r
) {
return
base64_encode
(
$encrypted
);
}
return
null;
}
/**
* decrypt with the public key
*/
public
function
pubDecrypt(
$crypted
) {
if
(!
is_string
(
$crypted
)) {
return
null;
}
$this
->setupPubKey();
$crypted
=
base64_decode
(
$crypted
);
$r
= openssl_public_decrypt(
$crypted
,
$decrypted
,
$this
->_pubKey);
if
(
$r
) {
return
$decrypted
;
}
return
null;
}
public
function
__destruct() {
@fclose(
$this
->_privKey);
@fclose(
$this
->_pubKey);
}
}
//以下是一个简单的测试demo,如果不需要请删除
$rsa
=
new
Rsa(
'ssl-key'
);
//私钥加密,公钥解密
echo
'source:我是老鳖<br />'
;
$pre
=
$rsa
->privEncrypt(
'我是老鳖'
);
echo
'private encrypted:<br />'
.
$pre
.
'<br />'
;
$pud
=
$rsa
->pubDecrypt(
$pre
);
echo
'public decrypted:'
.
$pud
.
'<br />'
;
//公钥加密,私钥解密
echo
'source:干IT的<br />'
;
$pue
=
$rsa
->pubEncrypt(
'干IT的'
);
echo
'public encrypt:<br />'
.
$pue
.
'<br />'
;
$prd
=
$rsa
->privDecrypt(
$pue
);
echo
'private decrypt:'
.
$prd
;
?>
|
对称加密算法 。
对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以 从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在 安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信性至关重 要.
对称加密的常用算法有: DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法.
在PHP中也有封装好的对称加密函数 。
1
2
3
4
5
6
7
8
|
Urlencode/Urldecode
string urlencode ( string
$str
)
/*
1. 一个参数,传入要加密的字符串(通常应用于对URL的加密)
2. urlencode为双向加密,可以用urldecode来加密(严格意义上来说,不算真正的加密,更像是一种编码方式)
3. 返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。
*/
|
通过Urlencode函数解决链接中带有&字符引起的问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
<?php
$pre_url_encode
=
"zhougang.com?username=zhougang&password=zhou"
;
//在实际开发中,我们很多时候要构造这种URL,这是没有问题的
$url_decode
=
"zhougang.com?username=zhou&gang&password=zhou"
;
//但是这种情况下用$_GET()来接受是会出问题的;
/*
Array
(
[username] => zhou
[gang] =>
[password] => zhou
)
*/
//如下解决问题:
$username
=
"zhou&gang"
;
$url_decode
=
"zhougang.com?username="
.urlencode(
$username
).
"&password=zhou"
;
?>
常见的urlencode()的转换字符
?=> %3F
= => %3D
% => %25
& => %26
\ => %5C
base64
string
base64_decode
( string
$encoded_data
)
base64_encode
()接受一个参数,也就是要编码的数据(这里不说字符串,是因为很多时候base64用来编码图片)
base64_encode
()为双向加密,可用
base64_decode
()来解密
$data
=
file_get_contents
(
$filename
);
echo
base64_encode
(
$data
);
/*然后你查看网页源码就会得到一大串base64的字符串,
再用base64_decode()还原就可以得到图片。这也可以作为移动端上传图片的处理方案之一(但是不建议这样做哈)
*/
?>
|
严格的来说..这两个函数其实不算是加密,更像是一种格式的序列化 。
以下是我们PHP程序中常用到的对称加密算法 。
discuz经典算法 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
<?php
function
authcode(
$string
,
$operation
=
'DECODE'
,
$key
=
''
,
$expiry
= 0) {
// 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
$ckey_length
= 4;
// 密匙
$key
= md5(
$key
?
$key
:
$GLOBALS
[
'discuz_auth_key'
]);
// 密匙a会参与加解密
$keya
= md5(
substr
(
$key
, 0, 16));
// 密匙b会用来做数据完整性验证
$keyb
= md5(
substr
(
$key
, 16, 16));
// 密匙c用于变化生成的密文
$keyc
=
$ckey_length
? (
$operation
==
'DECODE'
?
substr
(
$string
, 0,
$ckey_length
):
substr
(md5(microtime()), -
$ckey_length
)) :
''
;
// 参与运算的密匙
$cryptkey
=
$keya
.md5(
$keya
.
$keyc
);
$key_length
=
strlen
(
$cryptkey
);
// 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),
//解密时会通过这个密匙验证数据完整性
// 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
$string
=
$operation
==
'DECODE'
?
base64_decode
(
substr
(
$string
,
$ckey_length
)) :
sprintf(
'%010d'
,
$expiry
?
$expiry
+ time() : 0).
substr
(md5(
$string
.
$keyb
), 0, 16).
$string
;
$string_length
=
strlen
(
$string
);
$result
=
''
;
$box
= range(0, 255);
$rndkey
=
array
();
// 产生密匙簿
for
(
$i
= 0;
$i
<= 255;
$i
++) {
$rndkey
[
$i
] = ord(
$cryptkey
[
$i
%
$key_length
]);
}
// 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
for
(
$j
=
$i
= 0;
$i
< 256;
$i
++) {
$j
= (
$j
+
$box
[
$i
] +
$rndkey
[
$i
]) % 256;
$tmp
=
$box
[
$i
];
$box
[
$i
] =
$box
[
$j
];
$box
[
$j
] =
$tmp
;
}
// 核心加解密部分
for
(
$a
=
$j
=
$i
= 0;
$i
<
$string_length
;
$i
++) {
$a
= (
$a
+ 1) % 256;
$j
= (
$j
+
$box
[
$a
]) % 256;
$tmp
=
$box
[
$a
];
$box
[
$a
] =
$box
[
$j
];
$box
[
$j
] =
$tmp
;
// 从密匙簿得出密匙进行异或,再转成字符
$result
.=
chr
(ord(
$string
[
$i
]) ^ (
$box
[(
$box
[
$a
] +
$box
[
$j
]) % 256]));
}
if
(
$operation
==
'DECODE'
) {
// 验证数据有效性,请看未加密明文的格式
if
((
substr
(
$result
, 0, 10) == 0 ||
substr
(
$result
, 0, 10) - time() > 0) &&
substr
(
$result
, 10, 16) ==
substr
(md5(
substr
(
$result
, 26).
$keyb
), 0, 16)) {
return
substr
(
$result
, 26);
}
else
{
return
''
;
}
}
else
{
// 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
// 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
return
$keyc
.
str_replace
(
'='
,
''
,
base64_encode
(
$result
));
}
}
|
加解密函数encrypt() 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<?php
//$string:需要加密解密的字符串;$operation:判断是加密还是解密,E表示加密,D表示解密;$key:密匙
function
encrypt(
$string
,
$operation
,
$key
=
''
){
$key
=md5(
$key
);
$key_length
=
strlen
(
$key
);
$string
=
$operation
==
'D'
?
base64_decode
(
$string
):
substr
(md5(
$string
.
$key
),0,8).
$string
;
$string_length
=
strlen
(
$string
);
$rndkey
=
$box
=
array
();
$result
=
''
;
for
(
$i
=0;
$i
<=255;
$i
++){
$rndkey
[
$i
]=ord(
$key
[
$i
%
$key_length
]);
$box
[
$i
]=
$i
;
}
for
(
$j
=
$i
=0;
$i
<256;
$i
++){
$j
=(
$j
+
$box
[
$i
]+
$rndkey
[
$i
])%256;
$tmp
=
$box
[
$i
];
$box
[
$i
]=
$box
[
$j
];
$box
[
$j
]=
$tmp
;
}
for
(
$a
=
$j
=
$i
=0;
$i
<
$string_length
;
$i
++){
$a
=(
$a
+1)%256;
$j
=(
$j
+
$box
[
$a
])%256;
$tmp
=
$box
[
$a
];
$box
[
$a
]=
$box
[
$j
];
$box
[
$j
]=
$tmp
;
$result
.=
chr
(ord(
$string
[
$i
])^(
$box
[(
$box
[
$a
]+
$box
[
$j
])%256]));
}
if
(
$operation
==
'D'
){
if
(
substr
(
$result
,0,8)==
substr
(md5(
substr
(
$result
,8).
$key
),0,8)){
return
substr
(
$result
,8);
}
else
{
return
''
;
}
}
else
{
return
str_replace
(
'='
,
''
,
base64_encode
(
$result
));
}
}
?>
|
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 。
最后此篇关于PHP中的多种加密技术及代码示例解析的文章就讲到这里了,如果你想了解更多关于PHP中的多种加密技术及代码示例解析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用框架的对象编写一个用于加密/解密的简单库。方法如下: public static byte[] Encrypt(byte[] key, byte[] vector, byte[] input
据我所知,RIM Crypto API 似乎只提供用于对称加密 (3Des) 的 PKCS5 填充模式。我正在使用 JDE 4.6.0。 我正在尝试为黑莓应用程序提供密码学,该应用程序需要与已经使用标
我已经获得了用于加密的 Java 实现,但遗憾的是我们是一家 .net 商店,我无法将 Java 整合到我们的解决方案中。可悲的是,我也不是 Java 专家,所以我已经为此苦苦挣扎了几天,我想我终于可
我正在尝试使用 KMS 和 AWS 加密 SDK 加密数据。查看 AWS documentation 中提供的示例,似乎没有地方可以明确设置数据 key 。 我找到了 EncryptionMateri
我目前有一个用于为我的网站制作哈希的代码,该代码使用 SALT 进行哈希处理,因此密码是不可逆的...... 目前它是 100% 为我的网站工作,它是使用 ASP.NET(C#) 编码的 这是我的代码
我想要做的是在 javascript 中生成一个 key 对,并在 PHP 中使用这些加密,然后用 JS 解密。 我在附加的代码中有两个问题 它不会从装甲文本块重新加载私钥 并且它不会解密 PHP 加
在进行密码哈希时,我有以下 node.js 代码。 body.password = covid@19 salt = "hello@world" body.passwordhex = crypto.cr
我想知道的是在配置文件中加密连接字符串的明确方法。以下是我的问题: 使用机器级加密,访问我的服务器的任何人都不能编写一个小的 .Net 程序来读取连接字符串的内容吗? 如果我将我的应用程序部署到企业环
我知道 rsync 可以在文件传输期间启用/禁用 ssh 加密协议(protocol)。那么,如果 ssh 加密协议(protocol)被禁用了,是不是意味着 rsync 根本不做任何加密呢? 另外,
脚本必须搜索网页内的字符串。但该脚本不应显示它正在搜索的字符串。我的意思是搜索字符串应该采用加密格式或任何其他格式。但如果没有该搜索字符串,则不应显示网页或应在页面上显示错误。 我要开发一个插件。如果
我正在尝试加密 MySQL 上的某些字段。我正在使用 TPC-DS 的 v2.8 版本,并尝试在客户地址表的某些列上使用 AES。知道如何加密字段的所有行吗?我尝试使用 UPDATE customer
我需要一个简单的 javascript 函数,它允许我使用 key 加密 textarea 数据( key 是存储为散列 session 变量的用户密码,由 PHP 打印到字段中) 我基本上希望在用户
如何在 JavaScript 中散列/加密字符串值?我需要一种机制来隐藏 localStorage/cookie 中的一些数据吗? 这与安全问题有关,但我想为我的数据提供一些保护。 最佳答案 有很多
我有一个程序,其中数据库的密码由远程用户设置。该程序将用户名和密码保存到 xml 文件中的加密字符串中,否则应该是人类可读的。现在,这工作正常,我使用带有 key 的 C# DES 加密,它被加密和解
Kotlin 中是否有任何关于椭圆曲线加密的信息? 用于生成 key 对和加密、解密消息。 关于这个主题的信息很少甚至没有。 例如,我想实现 ECC P-521 椭圆曲线。 是否可以在 Kotlin
所以我知道 MD5 在技术上是新应用程序的禁忌,但我随机想到了这个: 自 md5($password); 不安全,不会 md5(md5($password)) 是更好的选择?我使用它的次数越多,它会变
我一直在努力使用 crypto_secretbox_easy() 在 libsodium 中加密/解密一些数据| .我似乎找不到关于使用的任何好的文档。 我想从用户那里获取密码,用它来以某种方式制作
我正在做一个加密项目 视频,我对这个程序有几个问题。 我用命令转码mp4至HLS与 ts段持续时间约为 10 秒。 首先,我需要使用数据库中的 key 加密这些视频。然而, 我不知道是否使用 ffmp
我有一个加密/复制保护问题。 我正在为使用加密狗的公司编写应用程序。请不要告诉我软件保护是没有用的,或者我应该让它自由地飞向空中,或者我花任何时间这样做都是浪费;这不是关于软件保护有效性的哲学问题,更
我对 有一个疑问VIM 加密 key . 我有一个文本文件,我使用加密该文件 :X 现在,加密 key 的存储位置(路径)。 无论是存储在单独的文件中还是存储在文本文件本身中。 如果我打开文件,它会询
我是一名优秀的程序员,十分优秀!