最近做的一个项目,想要使用公司的OA账户,但是OA系统是php语言开发的,首先要解决的就是如何在java中做密码校验,而OA系统使用的是php crypt()函数加密,刚开始想着通过相同的算法,生成密文,然后再与数据库中存的密文做比较就可以了。但是,查了php crypt()函数的文档:
也就是说需要知道salt以及相应的加密方式才能生成密文,跟OA开发方联系,懂的人不回信,回信的人又不懂,只说使用crypt加密,salt都不知道,说问问别人再回复,顿时感觉没指望啦,果不其然,一下班立马联系不上啦,关键时刻还得靠自己啊,谷哥度娘一起上,从网上下了一份老版本的源码,虽然不是很全,但是还是有价值的,在修改密码功能中发现了有用的东东:
$query = "SELECT PASSWORD,USEING_KEY from USER where USER_ID='".$LOGIN_USER_ID."'"; $cursor = exequery( $connection, $query ); if ( $ROW = mysql_fetch_array( $cursor ) ) { $PASSWORD = $ROW['PASSWORD']; $USEING_KEY = $ROW['USEING_KEY']; if ( crypt( $PASS0, $PASSWORD ) != $PASSWORD ) { message( "错误", "输入的原密码错误!" ); button_back( ); exit( ); } } $PASS1 = crypt( $PASS1 ); $CUR_TIME = date( "Y-m-d H:i:s", time( ) ); $query = "update USER SET PASSWORD='".$PASS1."',LAST_PASS_TIME='{$CUR_TIME}' where USER_ID='{$LOGIN_USER_ID}'"; exequery( $connection, $query );
从上面来看,密码的生成是直接调用crypt()函数的,没有加salt,根据文档,是按照响应的规则自动随机生成的,并且每次生成的都不一样,也就是说,根据只有明文是不能直接得到密文的,此路不通,只能另辟蹊径。再看上面输出message()的if语句条件 crypt( $PASS0, $PASSWORD ) != $PASSWORD,这个也就是判断密码是否正确的条件,里面的$PASS0是密码的明文,$PASSWORD是数据库里面存的密文,按照这个逻辑,使用php代码将已知的密码明文以及密码密文做个验证,这里有个在线运行php以及其他语言代码的网站,还不错:http://codepad.org,经验证,所有测试的密码明文和密文都是匹配的,也就是说在当前版本的OA系统中,这块儿的逻辑还没有发生变化。
现在的问题就是找到该crypt方法的java语言实现,还是谷哥给力,在http://stackoverflow.com/questions/3292160/equivalent-of-phps-crypt-function-in-java中有人提到了apache的commons-codes里面的两个类UnixCript 和Md5Crypt,经过查看java doc以及测试,最终证实Md5Crypt中的md5Crypt方法可以实现上述php代码中crypt的功能。Over!
虽然问题得到了解决,但是还有疑问有待进一步研究:为什么crypt( $PASS0, $PASSWORD ) == $PASSWORD 就可以说明密码正确了?(这个可能需要详细了解其加密算法)
相关推荐
crypt-md5源代码,这是linux里面最常用密码校验算法,利用salt和password和crypt函数生成hash值,原理就是用数次md5函数
本文介绍了开发PHP应用中如果不想自己开发新的加密算法,还可以利用PHP提供的crypt()函数来完成单向加密功能。实现了一个简单的用户身份验证系统。在使用crypt()保护重要的机密信息时,需要注意的是,在缺省状态下...
crypt()函数用于返回使用DES、Blowfish或MD5算法加密过后的字符串,crypt(str,salt)接受2个参数,第1个为需要加密的字符串,第2个为盐值(加密干扰值,如果没有提供,则默认由PHP自动生成),返回的字符串为散列的...
PHP crypt() 函数 定义和用法 crypt() 函数返回使用 DES、Blowfish 或 MD5 算法加密的字符串。 在不同的操作系统上,该函数的行为不同,某些操作系统支持一种以上的算法类型。在安装时,PHP 会检查什么算法可用以及...
在Linux下生成crypt加密密码的方法.docx
//crypt第二个为可选参数可以随便填写会作为加密是的干扰串,不填写则会随机生成一个干扰串 echo Sha1('zxccxz',$raw_output=true); //Sha1这种加密方式跟MD5相差不是很大都有一个$raw_output的可选参数,使用方法也...
隐窝 用java实现密码学算法
$str = '应用crypt()函数进行单向加密!'; //声明字符串变量$str echo '加密前$str的值为:'.$str; $crypttostr = crypt($str); //对变量$str加密 echo '加密后$str的值为:'.$crypttostr; //输出加密后的变量 ?&...
AES Crypt Decrypt JAVA Source code
crypt4j GNU C库(glibc)中提供的crypt(3)函数的Java实现。 此实现支持MD5,SHA-256和SHA-512变体。 此外,它通过Commons Codec库支持旧式DES。Maven工件要在Maven项目中使用crypt4j,只需在POM中包括以下依赖项。 ...
java-unrar 支持密码 纯java
JAVA applet to crypt and decrypt a file (size limitation 1 Ko).
在开发PHP应用中如果不想自己开发新的加密算法,还可以利用PHP提供的crypt()函数来完成单向加密功能
CryptoAPI简介,CryptAPI函数库介绍,CryptoAPI编程
AR Crypt.rar
Advanced Encrypt Algorithm (AES) is a symetric method to crypt message or document
查看源码我们可以发现它使用的是PHP函数password_hash()和crypt()生成。 加密: /** * $password 要加密的密码 * $hash 加密后的hash字符串 */ $hash = Yii::$app->getSecurity()->generatePasswordHash($...