PHP代码:

/**
* PBKDF2 加密函数
* 参考标准
* @link https://www.ietf.org/rfc/rfc2898.txt
*
* php官方函数将在php5.5发布
* @see http://php.net/manual/en/function.hash-pbkdf2.php
* example: pbkdf2("sha256", 'password', 'salt', 1, 20);
* result:120fb6cffcf8b32c43e7 (与php5.5内置的pbkdf2函数输出一至)
*
* @param string $algo The hash algorithm to use. Recommended: SHA256
* @param string $password The password to use for the derivation.
* @param string $salt The salt to use for the derivation.
* @param int $iterations The number of internal iterations to perform for the derivation.
* @param int $length The length of the derived key to output. If 0, the length of the supplied algorithm is used.
* @param boolean $raw_output When set to TRUE, outputs raw binary data. FALSE outputs lowercase hexits.
* @return string
*/
public static function pbkdf2($algo, $password, $salt, $iterations, $length= 0, $raw_output = false)
{
$algo = strtolower($algo);
if(!in_array($algo, hash_algos(), true))
throw new Exception('PBKDF2 ERROR: Invalid hash algorithm.');
if($iterations <= 0)
throw new Exception('PBKDF2 ERROR: Invalid parameters.');
// hash方式默认长度,对一个空值进行hash计算,得出
// length in octets of pseudorandom function output, a positive integer
$hlen = strlen(hash($algo, null, true));
if ($length <=0) $length = $hlen;
if ($length > (pow(2,32)-1)*$hlen)
throw new Exception('PBKDF2 ERROR: derived key too long.'); // 如果生成的加密值长度低于取值长度,就将加密再执行N遍以补足数据长度
// N=取值长度除以加密方式对应的值长度加一法取整
$block_count = ceil($length / $hlen);
$output = "";
for($i = 1; $i <= $block_count; $i++) {
// $i encoded as 4 bytes, big endian.
$last = $salt . pack("N", $i);
// first iteration
$last = $xorsum = hash_hmac($algo, $last, $password, true);
// perform the other $count - 1 iterations
for ($j = 1; $j < $iterations; $j++) {
$xorsum ^= ($last = hash_hmac($algo, $last, $password, true));
}
$output .= $xorsum;
}
if($raw_output)
return substr($output, 0, $length);
else
return substr(bin2hex($output), 0, $length);
}

JAVA 代码:

  /*  
    hashPassword("PBKDF2WithHmacSHA1","123456","abcdefg",1024,128);
  */
  static public byte[] hashPassword(String algorithm, String password, String salt, int iterations, int len) throws Exception{
PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), iterations, len);
SecretKeyFactory kFactory=SecretKeyFactory.getInstance(algorithm);
SecretKey secretKey = kFactory.generateSecret(pbeKeySpec);
byte[] buff = secretKey.getEncoded();
return buff;
}

PHP & JAVA 实现 PBKDF2 加密算法的更多相关文章

  1. Java的各种加密算法

    Java的各种加密算法 JAVA中为我们提供了丰富的加密技术,可以基本的分为单向加密和非对称加密 1.单向加密算法 单向加密算法主要用来验证数据传输的过程中,是否被篡改过. BASE64 严格地说,属 ...

  2. Java执行js加密算法

    Java执行js加密算法 今日需求:在后端执行一段加密算法,算法是js写的 明白需求以后疯狂百度.最后发现JDK提供了各种脚本的支持(怪笔者学艺不精,第一次见识到这个库,留下不学无术的泪水),正题开始 ...

  3. JAVA使用DES加密算法加密解密

    程序中使用了.properties文件作为参数配置文档,好处是灵活配置各项参数 一旦对数据库的一些参数进行了配置,势必涉及数据库的IP,端口,用户名和密码 properties文件全是unicode编 ...

  4. Java中间MD5加密算法完整版

    携带Java软件开发过程.,因此Java中提供了自带的MessageDigest实现对文本的加密算法,以下是一个对文本进行加密的MD5加密工具类代码演示样例: package net.yuerwan. ...

  5. Java使用RSA加密算法对内容进行加密

    什么是RSA加密算法 RSA是一种典型的非对称性加密算法,具体介绍可参考阮一峰的日志 RSA算法原理 下面是使用RSA算法对传输内容进行加密的一个简要Java案例,主要用到了三个类,大体实现如下: 对 ...

  6. JAVA实现MD5加密算法(使用MessageDigest)

    http://blog.csdn.net/ymc0329/article/details/6738711 *********************************************** ...

  7. JAVA的非对称加密算法RSA——加密和解密

    原文转载至:https://www.cnblogs.com/OnlyCT/p/6586856.html 第一部分:RSA算法原理与加密解密 一.RSA加密过程简述 A和B进行加密通信时,B首先要生成一 ...

  8. Java学习---MD5加密算法

    前言 在我们日常的程序开发中,或多或少会遇到一些加密/解密的场景,比如在一些接口调用的过程中,我们(Client)不仅仅需要传递给接口服务(Server)必要的业务参数,还得提供Signature(数 ...

  9. Java工具类-加密算法

    import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.securit ...

随机推荐

  1. 关于lambda表达式树

    总而言之: 就是在表达式中没有花括号. IEnumerable<Rect> rectlist3 = rectlist.Select(rect =>newRect(rect.X + 2 ...

  2. laravel实现第三方登录(qq登录)

    首先composer安装依赖: composer require socialiteproviders/qq 注册服务提供者(同时注释掉原有的Socialite提供者): 'providers' =& ...

  3. python 3.5 猜数字游戏

    #!/usr/bin/env python #encoding: utf-8 number = 88 for i in range(1,6): num = int(input('gusee numbe ...

  4. android-support-v7-appcompat的配置使用

    直接将android-support-v7-appcompat.jar包拷贝到项目的libs/下面是不能使用的,具体做法官方文档给出了详细说明: (开发环境是ADT) Using Eclipse Cr ...

  5. 如何设置让外网通过路由器IP加端口号访问到局域网一台Web服务器

    场景描述: 我们局域网内所有主机链接一台路由器,通过设置动态获取IP上网,现在想让一台主机作为Web 服务器,让外网用户通过http://ip:port的方式访问. 1:首先修改Apache的端口号: ...

  6. cf D. Pair of Numbers

    http://codeforces.com/contest/359/problem/D 题意:给你n个数,然后找出在[l,r]中有一个数a[j],l<=j<=r,在[l,r]中的所有数都是 ...

  7. Codeforces 538E Demiurges Play Again(博弈DP)

    http://codeforces.com/problemset/problem/538/E 题目大意: 给出一棵树,叶子节点上都有一个值,从1-m.有两个人交替从根选择道路,先手希望到达的叶子节点尽 ...

  8. Qt中用QSS切分图片

    Qt设计时有时需要实现动态按钮,按钮点击时一个状态,鼠标悬浮时一个状态,离开时一个状态,静止时一个状态.可以用一张png长图,使用QSS分段截取,分配给每一个状态.    1.调用函数 SetButt ...

  9. 【Xamarin 开发 IOS --IOS ViewController生命周期】

    ViewController ViewController是IOS开发中MVC模式中的C,ViewController是view的controller,ViewController的职责主要包括管理内 ...

  10. 一个资深java面试官的“面试心得”

    在公司当技术面试官几年间,从应届生到工作十几年的应聘者都遇到过.先表达一下我自己对面试的观点: 1.笔试.面试去评价一个人肯定是不够准确的,了解一个人最准确的方式就是“路遥知马力,日久见人心”.通过一 ...