在使用Suitecrm的过程中,需要使用java代码实现注册登录功能,并且还得让java端注册的用户仍然可以登录php管理后台。阅读Suitecrm的登陆注册代码之后,找到了计算user_hash值的函数:

/modules/Users/User.php/**

* Generate a new hash from plaintext password

* @param string $password

*/

public static function getPasswordHash($password)

{

if(!defined('CRYPT_MD5') || !constant('CRYPT_MD5')) {

// does not support MD5 crypt - leave as is

if(defined('CRYPT_EXT_DES') && constant('CRYPT_EXT_DES')) {

return crypt(strtolower(md5($password)),

"_.012".substr(str_shuffle('./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'), -4));

}

// plain crypt cuts password to 8 chars, which is not enough

// fall back to old md5

return strtolower(md5($password));

}

return @crypt(strtolower(md5($password)));

}

/**

* Check that password matches existing hash

* @param string $password Plaintext password

* @param string $user_hash DB hash

*/

public static function checkPassword($password, $user_hash)

{

return self::checkPasswordMD5(md5($password), $user_hash);

}

/**

* Check that md5-encoded password matches existing hash

* @param string $password MD5-encoded password

* @param string $user_hash DB hash

* @return bool Match or not?

*/

public static function checkPasswordMD5($password_md5, $user_hash)

{

if(empty($user_hash)) return false;

if($user_hash[0] != '$' && strlen($user_hash) == 32) {

// Old way - just md5 password

return strtolower($password_md5) == $user_hash;

}

return crypt(strtolower($password_md5), $user_hash) == $user_hash;

}

可以看出注册的加密流程只有2步,第一步将用户提交的密码进行md5(小写值),第二步将md5后的值使用crypt计算出user_hash存到数据库中即可。

通过http://stackoverflow.com/questions/3292160/equivalent-of-phps-crypt-function-in-java得知Apache Commons Codec包中已经提供了和PHP的crypt一样的算法Md5Crypt.md5Crypt(byte[], salt)。

于是编写了下面的这个密码工具类实现了兼容:package com.github.shuiguang.utils;

import java.security.MessageDigest;

import org.apache.commons.codec.digest.Md5Crypt;

/**

* 与PHP兼容的crypt算法加密密码

*

* @author Z

*

*/

public class PasswordUtils {

/**

* 推荐使用js将用户的密码字段进行加密后传输

* @param args

*/

public static void main(String[] args) {

// 用户注册提交的密码

String password = "123456";

// 注册即可通过js得到md5值

String passwordMd5 = md5(password, "UTF-8");

// java后端通过getPasswordMd5Hash计算出密文并将passwordHash作为userHash存到数据库

String passwordHash = getPasswordMd5Hash(passwordMd5);

System.out.println(passwordHash);

// 查询出数据库中指定用户名的userHash

String userHash = "$1$ca/./n2.$aZZe.KhrFLJE6EAmlCuMa0";

// 通过checkPasswordMD5进行加密比对passwordMd5和userHash运算后的值还是不是userHash

boolean flag = checkPasswordMD5(passwordMd5, userHash);

// 如果还是userHash说明登陆的密码正确,否则错误

System.out.println(flag);

noJsCrypt();

}

/**

* 如果在前端未经过js的md5加密传输

*/

public static void noJsCrypt() {

// 用户注册提交的密码

String password = "123456";

// java后端通过getPasswordHash计算出密文并将passwordHash作为userHash存到数据库

String passwordHash = getPasswordHash(password);

System.out.println(passwordHash);

// 查询出数据库中指定用户名的userHash

String userHash = "$1$ca/./n2.$aZZe.KhrFLJE6EAmlCuMa0";

// 通过checkPasswordMD5进行加密比对passwordMd5和userHash运算后的值还是不是userHash

boolean flag = checkPassword(password, userHash);

// 如果还是userHash说明登陆的密码正确,否则错误

System.out.println(flag);

}

/**

* md5 加密算法

*

* @author Z

* @param s

* @param charset

* @return String 加密后的32位长度的字符串

*/

public static String md5(String s, String charset) {

try {

byte[] btInput = s.getBytes(charset);

MessageDigest mdInst = MessageDigest.getInstance("MD5");

mdInst.update(btInput);

byte[] md = mdInst.digest();

StringBuffer sb = new StringBuffer();

for (int i = 0; i

int val = ((int) md[i]) & 0xff;

if (val

sb.append("0");

}

sb.append(Integer.toHexString(val));

}

return sb.toString();

} catch (Exception e) {

return null;

}

}

/**

* 获取未md5后的密码加密密文

* @param password

* @return

*/

public static String getPasswordHash(String password) {

return password == null ? null : Md5Crypt.md5Crypt(md5(password, "UTF-8").getBytes());

}

/**

* 获取md5后的密码加密密文

* @param password

* @return

*/

public static String getPasswordMd5Hash(String passwordMd5) {

return passwordMd5 == null ? null : Md5Crypt.md5Crypt(passwordMd5.toLowerCase().getBytes());

}

/**

* 校验未md5后的密码password是不是和数据库中的userHash匹配

* @return

*/

public static boolean checkPassword(String password, String userHash) {

return password == null ? false : Md5Crypt.md5Crypt(md5(password, "UTF-8").toLowerCase().getBytes(), userHash).equals(userHash);

}

/**

* 校验md5后的密码passwordMd5是不是和数据库中的userHash匹配

* @return

*/

public static boolean checkPasswordMD5(String passwordMd5, String userHash) {

return passwordMd5 == null ? false : Md5Crypt.md5Crypt(passwordMd5.toLowerCase().getBytes(), userHash).equals(userHash);

}

}

经过测试,在java中创建的用户可以在Suitecrm管理后台正常登陆。

转载随意,但请附上文章地址:-)

java的crypt_JAVA实现PHP的crypt函数相关推荐

  1. crypt函数的使用(仅限LINUX)

    2019独角兽企业重金招聘Python工程师标准>>> crypt() 函数返回使用 DES.Blowfish 或 MD5 加密的字符串. 在不同的操作系统上,本函数的行为不同,某些 ...

  2. java random构造方法_Java中的Random()函数及两种构造方法

    Java中存在着两种Random函数: java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是 ...

  3. 【Groovy】Groovy 代码创建 ( 使用 Java 语法实现 Groovy 类和主函数并运行 | 按照 Groovy 语法改造上述 Java 语法规则代码 )

    文章目录 一.创建 Groovy 代码文件 二.使用 Java 语法实现 Groovy 类和主函数并运行 三.按照 Groovy 语法改造上述 Java 语法规则代码 一.创建 Groovy 代码文件 ...

  4. php crypt加密 盐值,PHP crypt()函数的用法讲解

    PHP crypt() 函数 定义和用法 crypt() 函数返回使用 DES.Blowfish 或 MD5 算法加密的字符串. 在不同的操作系统上,该函数的行为不同,某些操作系统支持一种以上的算法类 ...

  5. java convert函数_自己实现 java中 Convert.toDouble(String str)处理函数 | 学步园

    今天在superWaba上看到Convert.toDouble(String str),由于底层问题比较大的数就出错,现在自己写了一个 程序中info()是我加的打印,可以去掉 java中 Conve ...

  6. php crypt mysql password_php使用crypt()函数进行加密

    一.代码 $str = '应用crypt()函数进行单向加密!'; //声明字符串变量$str echo '加密前$str的值为:'.$str; $crypttostr = crypt($str); ...

  7. Java中static代码块,main函数,构造函数运行顺序

    1.Java中static代码块,main函数,构造函数运行顺序如下: 答:static代码块是主动执行的,因此static代码块先执行,然后是执行构造函数,最后是Main函数. 如下例子: publ ...

  8. Java JNA (二)—— dll回调函数实现

    java调用dll文件需要使用回调函数作为公开函数的参数时,用以下方法实现: 首先,看c++中定义的dll公开函数: typedef void (*ccback)(char *name ,int le ...

  9. 没有包含主函数 java_JavaBean也是Java类,因此也必须有主函数。( )_学小易找答案...

    [单选题]对于M7475B型磨床,工作台的移动采用( )控制. [单选题]一台牵引列车的直流电机( ). [单选题]下列有关蛋白质的说法错误的是( ) [判断题]JavaBean组件就是Java开发中 ...

最新文章

  1. eclipse java 编译jar_Eclipse对Java项目打Jar包
  2. 给你一天时间,如何理清AI圈儿现状?
  3. php中register_global,PHP安全之register_globals的on和off的区别
  4. 纯CSS打造可折叠树状菜单
  5. python 线型_CCF 202006-1 线性分类器 python
  6. DataGridView实现多维表头
  7. 游戏云平台怎么开发_百度“云手机”与咪咕快游共建国内最大云游戏平台
  8. mysql服务器的字符集
  9. 【To Debug】牛客网--华为机试在线训练3:明明的随机数
  10. 随机生成大小为100的范围是100-1000的不重复的数组
  11. 富士施乐3300打印机驱动安装说明
  12. Windows设置并切换代理服务器
  13. 51cto学院mysql_Mysql -1_ Python系列视频(一)——Python语言基础_Python视频-51CTO学院...
  14. java 获取list的泛型_获取java.util.List的泛型类型
  15. 线上服务导致cpu飙升问题排查
  16. 什么是matlab的幅值域,基于LabVIEW的虚拟频谱分析仪
  17. linux服务器安装anaconda,然后远程使用jupyter
  18. C++中this的理解
  19. [PTA]习题3-5 三角形判断
  20. 快消品行业商业数字化转型解决方案

热门文章

  1. C++ Windows下Glog日志库安装使用教程
  2. android-ImageView的拖动、旋转、缩放、边界回弹、双击缩放、单击销毁及源码下载
  3. linux查看磁盘空间情况命令,linux查看磁盘空间的命令是什么
  4. HTML使用JSignature签字并上传图片
  5. 已发邮件修改邮件内容
  6. Bootstrap基本介绍及运用
  7. 《胡雪岩·灯火楼台》—— 读后总结
  8. Bilinear model 及其相关文献
  9. 问题解决:Python | 字符串去除(中文、英文、数字、标点符号)
  10. 做可视化分析,它比Excel透视表强过10倍