一、Crack、CSPRNG、Hash、Mcrypt、Mhash、OpenSSL、密码散列算法的对比
 
Crack
CSPRNG
Hash
Mcrypt
Mhash
OpenSSL
密码散列算法
简介
本扩展使用CrackLib库来测试密码的强度。密码的强度是通过检查密码的长度、大小写,对照指定的CrackLib字典来检查的(原文:The 'strength' of a password is tested by that checks length, use of upper and lower case and checked against the specified CrackLib dictionary.)。
CSPRNG是The cryptographically secure pseudo-random number generator的缩写,即伪随机数生成器。该API提供一种简单、可靠的方法,生成加密强的随机整数和用于加密上下文的字节(原文:generate crypto-strong random integers and bytes for use within cryptographic contexts.)。
(哈希)信息摘要引擎。允许使用各种哈希算法直接或增量处理任意长度的信息。
本扩展是 mcrypt库的接口,提供了对多种块算法的支持, 包括:DES,TripleDES,Blowfish (默认), 3-WAY,SAFER-SK64,SAFER-SK128,TWOFISH,TEA,RC2 以及 GOST,并且支持 CBC,OFB,CFB 和 ECB 密码模式。 甚至,它还支持诸如 RC6 和 IDEA 这两种“非免费”的算法。 默认情况下,CFB/OFB 是 8 比特的。
本扩展是 Mhash库的接口,提供了对多种块算法的支持,包括MD5, SHA1, GOST等等。mhash可以用来创建校验和、消息摘要、消息认证码等。
OpenSSL 函数用来产生、验证签名,以及密封(加密)启封(解密)数据。
密码散列算法 API 提供了简单易用的 crypt() 包装, 以一种简洁易用安全的方式创建和管理密码。
安装
需安装此 PECL 扩展。
构建此扩展不需要其他扩展。
使用这些函数不需要安装,它们是 PHP 核心的一部分。
哈希扩展是内置的,不需要外部库, 默认是启用的,可以通过 --disable-hash 参数来禁用此扩展。
需要使用mcrypt库,使用 --with-mcrypt[=DIR] 参数来编译 PHP 以启用本扩展。 DIR 是 mcrypt 的安装路径。 请确保编译 libmcrypt 的时候使用了 --disable-posix-threads 选项。
使用 --with-mhash[=DIR] 参数来编译 PHP 以启用本扩展。 DIR 是 mcrypt 的安装路径。
使用 --with-openssl[=DIR] 参数来编译 PHP 以启用本扩展。 DIR 是 mcrypt 的安装路径。
构建此扩展不需要其他扩展。
使用这些函数不需要安装,它们是 PHP 核心的一部分。
配置
此扩展没有在 php.ini 中定义配置指令。
此扩展没有在 php.ini 中定义配置指令。
此扩展没有在 php.ini 中定义配置指令。
mcrypt.algorithms_dir - 包含算法的目录。
mcrypt.modes_dir - 包含模式的目录。
两个函数的行为受 php.ini 中的设置影响。二者均默认是libmcrypt的编译目录,通常是/usr/local/lib/libmcrypt。
此扩展没有在 php.ini 中定义配置指令。
openssl.cafile - 本地文件系统上认证授权文件的位置,应该与上下文选项verify_peer来进行远程节点的身份验证(原文:Location of Certificate Authority file on local filesystem which should be used with the verify_peer context option to authenticate the identity of the remote peer.)。
openssl.cafile  - 如果没有指定cafile或者没有找到证书,目录就会指向一个适合证书的capath。capath必须是一个正确的散列证书目录。(原文:If cafile is not specified or if the certificate is not found there, the directory pointed to by capath is searched for a suitable certificate. capath must be a correctly hashed certificate directory.)。
此扩展没有在 php.ini 中定义配置指令。
预定义常量
HASH_HMAC - hash_init() 中的可选标志。表示 HMAC digest-keying 算法应被用于当前哈希上下文环境。
MCRYPT_MODE_ECB
MCRYPT_MODE_CBC
MCRYPT_MODE_CFB
MCRYPT_MODE_OFB
MCRYPT_MODE_NOFB
MCRYPT_MODE_STREAM
常量仅在此扩展编译入PHP或在运行时动态载入时可用。
MHASH_CRC32
MHASH_MD5
MHASH_SHA1
PASSWORD_BCRYPT - 使用此常量生成结果的长度将在未来有变化。因此,数据库里储存结果的列可超过60个字符(最好是255个字符)。
PASSWORD_DEFAULT - 使用此常量生成的结果是 60 个字符的字符串
 
二、Crack
Pecl安装失败,从https://pecl.php.net/package/crack下载压缩包后,解压、编译、安装也失败了。
得找个时间专门研究编译安装扩展了。。。
 
三、CSPRNG——只能在PHP7下使用。
① 可以用来生成token或盐(salt)
random_bytes — 生成密码安全的伪随机字节。
语法:string random_bytes ( int $length ),生成适合加密使用的加密随机字节的任意长度字符串,如生成盐、密钥或初始化向量。
bin2hex — 把包含数据的二进制字符串转换为十六进制值。
语法:string bin2hex( string $str )
<?php
$bytes = random_bytes(5);
var_dump(bin2hex($bytes)); // 输出:string(10) "c8c9ceba82"
function RandomToken($length = 32){
if(!isset($length) || intval($length) <= 8 ){
$length = 32;
}
if (function_exists('random_bytes')) {
return bin2hex(random_bytes($length));
}
if (function_exists('mcrypt_create_iv')) {
return bin2hex(mcrypt_create_iv($length, MCRYPT_DEV_URANDOM));
}
if (function_exists('openssl_random_pseudo_bytes')) {
return bin2hex(openssl_random_pseudo_bytes($length));
}
}
function Salt(){
return substr(strtr(base64_encode(hex2bin(RandomToken(32))), '+', '.'), 0, 44);
}
echo (RandomToken()); // 输出:d5152e915a1e909ca79aa78ae70d978460caf60a2569559161862132eaeb2b3c
echo Salt(); // 输出:ko.el59enM/13S8pHD9bRuUyLR4IzIJmNN8fG7gR/Ic=
 
② 生成伪随机数
random_int— 生成密码安全的伪随机数。
语法:int random_int( int \$min , int \$max ),返回一个最小值~最大值之间的加密的安全随机整数。
<?php
var_dump(random_int(100, 999)); // 输出:int(961)
var_dump(random_int(-1000, 0)); // 输出:int(-632)
注:如果在PHP7以下的版本中使用,可参见在PHP 5.6和5.5中的random_bytes(),也就是使用random_compat,链接附上:https://github.com/paragonie/random_compat
 
四、Hash
① hash_algos — 返回已注册的哈希算法列表。
<?php
$algos = hash_algos();
print_r($algos);
// 输出:
Array (
  [0] => md2 [1] => md4 [2] => md5 [3] => sha1 [4] => sha224 [5] => sha256 [6] => sha384 [7] => sha512/224 [8] => sha512/256 [9] => sha512
  [10] => sha3-224 [11] => sha3-256 [12] => sha3-384 [13] => sha3-512 [14] => ripemd128 [15] => ripemd160 [16] => ripemd256 [17] => ripemd320 [18] => whirlpool [19] => tiger128,3
  [20] => tiger160,3 [21] => tiger192,3 [22] => tiger128,4 [23] => tiger160,4 [24] => tiger192,4 [25] => snefru [26] => snefru256 [27] => gost [28] => gost-crypto [29] => adler32
  [30] => crc32 [31] => crc32b [32] => fnv132 [33] => fnv1a32 [34] => fnv164 [35] => fnv1a64 [36] => joaat [37] => haval128,3 [38] => haval160,3 [39] => haval192,3
  [40] => haval224,3 [41] => haval256,3 [42] => haval128,4 [43] => haval160,4 [44] => haval192,4 [45] => haval224,4 [46] => haval256,4 [47] => haval128,5 [48] => haval160,5 [49] => haval192,5
  [50] => haval224,5 [51] => haval256,5
)
 
② hash_hmac — 使用 HMAC 方法生成带有密钥的哈希值。
语法:string hash_hmac ( string \$algo , string \$data , string \$key [, bool \$raw_output = false ] ),其中:
algo - 要使用的哈希算法名称,例如:"md5","sha256","haval160,4" 等。可通过hash_algos()函数获取;
data - 要进行哈希运算的消息;
key - 使用HMAC生成信息摘要时所使用的密钥;
raw_output - 设置为TRUE输出原始二进制数据,设置为FALSE输出小写 16 进制字符串。
<?php
$data = 'Today is Thursday.';
echo hash('md5', $data); // md5 哈希
// 不同的密钥生成的哈希值也不同
$key1 = 'md5-key';
echo hash_hmac('md5', $data, $key1);
$key2 = 'secret';
echo hash_hmac('md5', $data, $key2);
// 输出:
85e2a9ff0b743fb86888d3be904b512c
be1f48e3c5c4cb05b71f7eb0c7bd9286
80d6b50d68db6ac250b8688cda712a4a
 
③ 使用给定文件的内容生成哈希值
hash_file — 使用给定文件的内容生成哈希值。
语法:string hash_file ( string \$algo , string \$filename [, bool \$raw_output = false ] ),其中:
algo - 要使用的哈希算法名称,例如:"md5","sha256","haval160,4" 等。可通过hash_algos()函数获取;
filename - 要进行哈希运算的文件路径;
raw_output - 设置为TRUE输出原始二进制数据, 设置为FALSE输出小写 16 进制字符串;
hash_hmac_file — 使用 HMAC 方法和给定文件的内容生成带密钥的哈希值。
语法:string hash_hmac_file( string \$algo , string \$filename , string \$key [, bool \$raw_output = false ] ),其中:
key - 使用HMAC生成信息摘要时所使用的密钥。
<?php
$file = 'hmac.txt’;
$key = 'md5-key';
echo hash_file('md5', $file);
echo hash_hmac_file('md5', $file, $key);
// 输出:
hamc.txt内容为abcdefghijklmnopqrstuvwxyz
c3fcd3d76192e4007dfb496cca67e13b
c30c586135ef70cdad8a8db52912eadc
 
④ 封装成函数
hash && hash_hmac
/**
* @param $algo hash算法
* @param $data string|array 字符串或者字符串数组
* @param $options 进行哈希运算的可选设置,目前仅支持:HASH_HMAC。当指定此选项时,必须指定 key 参数
* @param $key 当 options 参数为 HASH_HMAC 时,使用此参数传入进行 HMAC 哈希运算时的共享密钥
*/
function get_hash_data($algo, $data, $options = 0, $key = NULL) {
$ctx = hash_init($algo, $options, $key);
if(is_string($data)) {
hash_update($ctx, $data);
} else if(is_array($data)) {
foreach($data as $d) {
hash_update($ctx, $d); //填充数据, 可以多次调用, 和拼接字符串效果一样
}
}
return hash_final($ctx); //输出最后的数据
}
$data = "Hello, world!";
$key = "md5-key";
echo get_hash_data('md5', $data);
echo hash('md5', $data); // 与直接使用hash函数的结果一样
echo get_hash_data('md5', $data, HASH_HMAC, $key);
echo hash_hmac('md5', $data, $key); // 与直接使用hash_hmac函数的结果一样
// 输出:
6cd3556deb0da54bca060b4c39479839
6cd3556deb0da54bca060b4c39479839
1954a2a2e7f7d4e67b8115487238b7ac
1954a2a2e7f7d4e67b8115487238b7ac
 
hash_file && hash_hmac_file
/**
* @param $algo hash算法
* @param $filename 要进行哈希运算的文件路径
* @param $options 进行哈希运算的可选设置,目前仅支持:HASH_HMAC。当指定此选项时,必须指定 key 参数
* @param $key 当 options 参数为 HASH_HMAC 时,使用此参数传入进行 HMAC 哈希运算时的共享密钥
*/
function get_hash_data_by_file($algo, $filename, $options = 0, $key = NULL) {
$ctx = hash_init($algo, $options, $key);
hash_update_file($ctx, $filename);
return hash_final($ctx);
}
$file = 'hmac.txt';
$key = 'md5-key';
echo get_hash_data_by_file('md5', $file);
echo hash_file('md5', $file); // 与直接使用hash_file函数的结果一样
echo get_hash_data_by_file('md5', $file, HASH_HMAC, $key);
echo hash_hmac_file('md5', $file, $key); // 与直接使用hash_hmac_file函数的结果一样
// 输出:
c3fcd3d76192e4007dfb496cca67e13b
c3fcd3d76192e4007dfb496cca67e13b
c30c586135ef70cdad8a8db52912eadc
c30c586135ef70cdad8a8db52912eadc
 
五、Mcrypt
Mcrypt库支持20多种加密算法和8种加密模式,可以通过函数mcrypt_list_algorithms()和mcrypt_list_modes()来显示加密算法和模式。
$algos = mcrypt_list_algorithms() ;
$algo_modes = mcrypt_list_modes() ;
print_r($algos);
print_r($algo_modes);
// 输出:
Array (
[0] => cast-128 [1] => gost [2] => rijndael-128 [3] => twofish [4] => arcfour [5] => cast-256 [6] => loki97 [7] => rijndael-192 [8] => saferplus [9] => wake
[10] => blowfish-compat [11] => des [12] => rijndael-256 [13] => serpent [14] => xtea [15] => blowfish [16] => enigma [17] => rc2 [18] => tripledes
)
Array ( [0] => cbc [1] => cfb [2] => ctr [3] => ecb [4] => ncfb [5] => nofb [6] => ofb [7] => stream )

这些算法和模式在实际应用中以常量表示,需要加上前缀MCRYPT_和MCRYPT_MODE_,如:MCRYPT_CAST-128和MCRYPT_MODE_CBC。

mcrypt_encrypt— 使用给定参数加密明文。
语法:string mcrypt_encrypt( string \$cipher , string \$key , string \$data , string \$mode [, string \$iv ] ),其中:
cipher - MCRYPT_ciphername 常量中的一个,或者是字符串值的算法名称;
key - 加密密钥。 如果密钥长度不是该算法所能够支持的有效长度,则函数将会发出警告并返回 FALSE;
data - 使用给定的 cipher 和 mode 加密的数据。 如果数据长度不是 n*分组大小,则在其后使用 '\0' 补齐。返回的密文长度可能比 data 更大;
mode - MCRYPT_MODE_modename 常量中的一个,或以下字符串中的一个:"ecb","cbc","cfb","ofb","nofb" 和 “stream”;
iv - 非NULL的初始化向量。
<?php
header("Content-Type:text/html; charset=utf-8");
$str = "今天是星期五"; //加密文本
$key = "12345678"; //密钥,需8bytes
$cipher = MCRYPT_DES; //密码类型
$modes = MCRYPT_MODE_ECB; //密码模式
$iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher,$modes),MCRYPT_RAND); //初始化向量
echo "加密前:".$str."<p>";
$str_encrypt = mcrypt_encrypt($cipher,$key,$str,$modes,$iv); //加密函数
echo "加密后:".$str_encrypt."<p>";
$str_decrypt =mcrypt_decrypt($cipher,$key,$str_encrypt,$modes,$iv); //解密函数
echo "还原:".$str_decrypt."<p>"; // 输出:
加密前:今天是星期五
加密后:�^�i��P�-�=����!��I�����
还原:今天是星期五
 
六、Mhash
mhash支持md5,sha1,crc32等多种散列算法,可以使用mhash_count()和mhash_get_hash_name()输出支持的算法名称。
$num = mhash_count();          //函数返回最大的hash id
echo "Mhash库支持的算法有:";
for($i = 0; $i <= $num; $i++){
echo '<br>';
echo $i."=>".mhash_get_hash_name($i); //输出每一个hash id 的名称
}
如果在实际应用中使用上面的常量,需要在算法名称前面加上 MHASH_作为前缀,比如 CRC32 表示为 MHASH_CRC32。
应用:使用mhash_keygen_s2k()函数生成一个校验码
<?php
header("Content-Type:text/html; charset=utf-8");
$str = "abcd";
$hash = 2 ;
$password = "1234";
$salt = "1234";
$key = mhash_keygen_s2k(1, $password, $salt,10); //生成key 值
$str_mhash =bin2hex(mhash($hash,$str,$key)); //使用$key值、$hash值对字符串$str加密
echo "校验码是:" . $str_mhash;
// 输出:
校验码是:503672248af07cdfbc2d645f7835935e1722630e
 
七、OpenSSL
1、对称加密相关
openssl_encrypt — 以指定的方式和 key 加密数据,返回原始或 base64 编码后的字符串。解密为openssl_decrypt。
语法:string openssl_encrypt( string \$data , string \$method , string \$key ),其中:
data - 数据;
method - 密码学方式,可以使用openssl_get_cipher_methods()获取有效密码方式列表;
key - 密钥;
options - 以下标记的按位或: OPENSSL_RAW_DATA 、 OPENSSL_ZERO_PADDING;
iv - 非NULL的初始化向量。
<?php
$string = 'Hello, world';
$method = 'aes-128-cbc';
$pass = '12345678';
$iv = '1234567812345678'; // 16 bytes
// 加密
$res = openssl_encrypt($string, $method, $pass, 0, $iv);
print_r($res);
// 解密
print_r(openssl_decrypt($res, $method, $pass, 0, $iv));
 
2、非对称加密相关
① 从证书导出密钥
openssl_get_publickey();openssl_pkey_get_public();      // 从证书导出公匙
openssl_get_privatekey();openssl_pkey_get_private();    // 从证书导出私匙
它们都需要传入证书文件(一般是.pem文件)。
② 使用密钥加密
openssl_public_encrypt();   // 使用公匙加密
语法:openssl_public_encrypt(string \$data , string &\$crypted , mixed \$key [, int \$padding = OPENSSL\_PKCS1\_PADDING ] ),其中:
$data - 要加密的数据;
$crypted - 一个引用变量,加密后的数据会被放入这个变量中;
$key - 要传入的公匙数据;
\$padding - 由于被加密数据分组时,有可能不会正好为加密位数bit的整数倍,所以需要\$padding(填充补齐),\$padding的可选项有 OPENSSL_PKCS1_PADDING, OPENSSL_NO_PADDING,分别为PKCS1填充,或不使用填充。
与此方法相对的还有(传入参数一致):
openssl_public_decrypt();   // 使用公匙解密
openssl_private_encrypt();  // 使用私匙加密
openssl_private_decrypt();  // 使用私匙解密
③ 签名和验签函数
openssl_sign — 签名函数
语法:bool openssl_sign ( string \$data , string &\$signature , mixed $priv_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] ),其中:
$data - 要签名的数据;
$signature - 签名结果的引用变量;
$priv_key_id - 签名所使用的私匙;
$signature_alg - 签名要使用的算法,其算法列表可以使用openssl_get_md_methods()得到。
openssl_sign — 验签函数
语法:int openssl_verify ( string \$data , string \$signature , mixed \$pub_key_id [, mixed \$signature_alg = OPENSSL_ALGO_SHA1 ] )
与签名函数相对,只不过它要传入与私匙对应的公匙,其结果为签名验证结果,1为成功,0为失败,-1则表示错误。
// 在终端执行下述两行命令生成密钥、公钥:
// 密钥生成
openssl genrsa -out rsa_private_key.pem 1024
// -out 指定生成的密钥的文件名
// 1024 生成一个1024长度的密钥,密钥长度越长越安全,但加解密所耗时间亦变长。
// 公钥生成
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
// -in filename:输入的RSA密钥文件,在此为上面生成的密钥 rsa_private_key.pem。
// -pubout:设置此选项后,保存公钥值到输出文件中。
// -out filename:输出文件,在此我们定义成rsa_public_key.pem <?php
// 私钥文件的路径
$private_path = 'rsa_private_key.pem';
// 公钥文件的路径
$public_path = 'rsa_public_key.pem';
// 生成Resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false
$private_key = openssl_pkey_get_private(file_get_contents($private_path));
// 生成Resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false
$public_key = openssl_pkey_get_public(file_get_contents($public_path)); // 原数据
$original_data = '我的帐号是:liulu,密码是:123456';
// 加密以后的数据,用于在网路上传输
$encrypt_data = ''; echo '原数据为:', $original_data, PHP_EOL; /*用私钥加密*/
if (openssl_private_encrypt($original_data, $encrypt_data, $private_key)) {
// 加密后 可以base64_encode后方便在网址中传输 或者打印 否则打印为乱码
echo '加密成功,base64_encode加密后数据为:', base64_encode($encrypt_data), PHP_EOL;
} else {
die('加密失败');
} /*用公钥解密*/
// 解密以后的数据
$decrypt_data ='';
if (openssl_public_decrypt($encrypt_data, $decrypt_data, $public_key)) {
echo '解密成功,解密后数据为:', $decrypt_data, PHP_EOL;
} else {
die('解密成功');
} // 输出:
原数据为:我的帐号是:liulu,密码是:123456
加密成功,base64_encode加密后数据为:enIrL+MrxiE61JP1YUA0kIIusQc2VyGb+Vylj4NptA7n4mfMMKKqAxuAwligJQXsB/X+nmQ4hbSxlIJlLLDmAyLa4f5Ss0yLyAzl4bLhAEzFuHucwcJW5euO9+qNr+FsqSdRviqTRwDTmDRmDA1Nhap4bR14N1vebyc2inY8vT4= 解密成功,
解密后数据为:我的帐号是:liulu,密码是:123456
 
八、密码散列算法
简单的md5加密很容易通过字典的方式进行破解,随便找个md5解密的网站就能获取原始密码,Password Hashing API就能很好地解决这个问题,它包含4个函数:password_get_info()、password_hash()、password_needs_rehash()、password_verify()。
① password_hash — 创建密码的哈希(hash)
语法:string password_hash ( string \$password , integer \$algo [, array \$options ] ),其中:
password - 用户密码
algo - 密码算法常量,仅PASSWORD_BCRYPT和PASSWORD_DEFAULT二者可选
options - 一个包含有选项的关联数组。目前支持两个选项:salt,在散列密码时加的盐(干扰字符串)以及cost,用来指明算法递归的层数。省略后,将使用随机盐值与默认 cost。
<?php
/**
* 使用password_hash()
* 使用默认算法哈希密码
* 当前是 BCRYPT,并会产生 60 个字符的结果。
*
* 请注意,随时间推移,默认算法可能会有变化,
* 所以需要储存的空间能够超过 60 字(255字不错)
*/
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
echo "</br>"; /**
* 使用password_hash() 手动设置 cost
* PASSWORD_BCRYPT算法为 BCRYPT 增加 cost 到 12。
* 始终产生 60 个字符。
*/
$options = [
'cost' => 12,
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
echo "</br>"; /**
* 使用password_hash() 手动设置盐值
* 这里的盐值是随机产生的。
* 永远都不要使用固定盐值,或者不是随机生成的盐值。
*
* 绝大多数情况下,可以让 password_hash generate 为你自动产生随机盐值
*/
$options = [
'cost' => 11,
'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options); // 输出:
$2y$10$1nPMiGAcPK0mGP0WC67YYebG9toLW0eb9Qg.IYKCK5H9hWVacR2qi
$2y$12$Dm0QoI9Owtfl2UFjkhF/Ru.XQLuNC7bwajfsgH..SDFJ4k0ViFF1u
$2y$11$ZYpIjzZ/dd3SeZeqFYMolO7VElissnyaFAtmY.RKPLbcb3cPhwB7W
 
② password_verify — 验证密码是否和哈希匹配。
语法:boolean password_verify( string \$password , string \$hash ),其中参数hash为使用password_hash()创建的散列值。
<?php
$hash = '$2y$11$ZYpIjzZ/dd3SeZeqFYMolO7VElissnyaFAtmY.RKPLbcb3cPhwB7W';
if (password_verify('rasmuslerdorf', $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
// 输出:
Password is valid!

PHP手册-函数参考-加密扩展的更多相关文章

  1. PHP手册-函数参考-日期与时间相关扩展

    一.Calander.日期/时间.HRTime扩展的对比   Calendar 日期/时间 HRTime 简介 历法扩展集包括了一系列用于在不同历法间进行转换的函数,它是以Julian Day计数为中 ...

  2. hive函数参考手册

    hive函数参考手册 原文见:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF 1.内置运算符1.1关系运算符 运 ...

  3. LoadRunner中常用函数参考手册

    基础篇1:LoadRunner中常用函数参考手册 常用函数列表 web_url web_submmit_form VS web_submmit_data VS web_custom_request w ...

  4. Arduino参考手册-函数和变量及电路图

    标题: Arduino参考手册-函数和变量及电路图 作者: 梦幻之心星 sky-seeker@qq.com 标签: [#Arduino,#参考手册,#函数,#变量] 目录: [Arduino] 日期: ...

  5. PHP的openssl加密扩展使用小结

    h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...

  6. mysql常用函数参考

    mysql常用函数参考   对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL, ...

  7. PHP openssl加密扩展使用总结

    1.检查服务器是否已安装了openssl组件,没有则先安装好 openssl version [-a] 2.对称加密 查询openssl支持的对称加密算法 openssl_get_cipher_met ...

  8. PHP mcrypt加密扩展使用总结

    在开发中,很多时候我们在前后端交互中需要对一些敏感数据进行一定的加密.PHP中有提供了mcrypt的这样一个加密扩展实现对数据的加密解密. 一.mcrypt扩展的安装 在低版本的PHP中需要在配置文件 ...

  9. Mysql 函数大全- 5.6 中文解释函数参考

    mysql 函数大全 5.6 函数参考 5.6函数参考    (只翻译部分,细节查看相关英文版) 12.1功能和操作员参考 12.2表达式评估中的类型转换 12.3运营商 12.4控制流功能 12.5 ...

随机推荐

  1. Docker5之Deploy your app

    Make sure you have published the friendlyhello image you created by pushing it to a registry. We’ll ...

  2. jvm 内存溢出问题排查方法

    如果你做TCP通讯或者map集合操作,并发处理等功能时,很容易出现 Java 内存溢出的问题.本篇文章,带领大家深入jvm,分析并找出jvm内存溢出的代码. jvm中除了程序计数器,其他的区域都有可能 ...

  3. 函数指针-如何理解typedef void (*pfun)(void)

    问题: 在刚接触typedef void (*pfun)(void) 这个结构的时候,存在疑惑,为什么typedef后只有一"块"东西,而不是两"块"东西呢?那 ...

  4. Codeforces 786 C. Till I Collapse

    题目链接:http://codeforces.com/contest/786/problem/C 大力膜了一发杜教的代码感觉十分的兹瓷啊! 我们知道如果$k$是给定的我们显然是可以直接一遍$O(n)$ ...

  5. Educational Codeforces Round 23 E. Choosing The Commander trie数

    E. Choosing The Commander time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  6. Navicat for MySQL用ssh功能连接远程数据库

    转载自:http://holy2010.blog.51cto.com/1086044/518431 实现用本地的ssh隧道起到加密功能 在windows平台上运行Navicat for MySQL(h ...

  7. 阿里云CentOS Linux服务器上搭建邮件服务器遇到的问题

    参考文章: 阿里云CentOS Linux服务器上用postfix搭建邮件服务器 Linux系统下邮件服务器的搭建(Postfix+Dovecot) 本来想自己搭建邮件服务器,但是看到一篇资料表示阿里 ...

  8. confirm("确定要删除吗?") _详解

    具体代码如下: html代码: <div class="deletes">删除</div> js代码: <script type="text ...

  9. .NET扩展方法 封装公用方法

    定义方法的时候  第一个参数前面加上this   表示这个方法可以被IQueryable类型的对象.出来  调用的时候 只用传第二个参数  第一个参数不用传 第一个参数就是.出当前方法的参数 定义扩展 ...

  10. Springboot:没有src/main/resources目录(引入图片时(或静态资源时)发现没有该目录)

    今天想在Springboot项目想引进静态资源时,发现自己的项目里没有教程里面的 src/main/resources这个目录,目录如下 我的项目目录结构是这样的,但是还不是很清楚下面的那个src目录 ...