最近做的一个项目,想要使用公司的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`函数和用户输入的密码尝试解密`/etc/shadow`中的hash值,如果匹配成功,则允许登录。 在压缩包`md5_crypt`中,可能包含了`crypt-md5`算法的实现源代码,这对于理解其工作原理和...
如果存在,我们将取出存储的密码(已加密),并使用`crypt()`函数和用户输入的密码生成一个新的加密值。比较这两个加密值,如果一致则允许用户登录,否则提示重新登录。如果用户名不存在,那么可能是新用户,此时将...
在Java中,`java.security`和`javax.crypto`这两个包提供了大量用于密码学操作的类和接口,如加密算法、密钥管理、哈希函数等。 1. **加密算法**: Java支持多种对称和非对称加密算法。对称加密如AES(高级加密标准...
- **无盐值加密**:在没有提供盐值的情况下,`crypt()` 函数会生成一个由PHP自动生成的盐值,这导致每次加密相同的字符串可能会得到不同的结果,因为盐值不同。 - **有盐值加密**:如果提供了盐值,`crypt()` 函数...
通过以上技术细节,我们可以了解到,虽然直接在数据库中修改密码看似简单,但为了保证系统的安全性,正确的做法是使用PostfixAdmin提供的md5crypt函数来生成符合要求的加密密码,并将其存回数据库中相应的字段。...
总的来说,`crypt()`函数在PHP中用于实现单向加密,特别是对于密码存储,它提供了基本的安全保障。但是,为了达到更高的安全性,应结合使用更强大的加密算法(如bcrypt或scrypt),并使用固定的盐值和适当的迭代次数...
标题中的"AES_JAVA_src.zip_AES_crypt.java"指出这是一个关于AES加密算法的Java源代码文件,被压缩在名为"AES_JAVA_src.zip"的压缩包内。"AES Crypt Decrypt JAVA Source code"的描述进一步证实了这个源代码是用于...
PHP crypt() 函数 定义和用法 crypt() 函数返回使用 DES、Blowfish 或 MD5 算法加密的字符串。 在不同的操作系统上,该函数的行为不同,某些操作系统支持一种以上的算法类型。在安装时,PHP 会检查什么算法可用以及...
在Linux下生成crypt加密密码的方法.docx
//crypt第二个为可选参数可以随便填写会作为加密是的干扰串,不填写则会随机生成一个干扰串 echo Sha1('zxccxz',$raw_output=true); //Sha1这种加密方式跟MD5相差不是很大都有一个$raw_output的可选参数,使用方法也...
Windows API中的CryptAPI是一组用于加密、解密、签名以及哈希处理的核心函数,它为开发者提供了安全的密码学服务。这个强大的工具集允许程序员在Windows操作系统上实现各种安全应用,如数字证书的管理、数据加密、...
本文将深入探讨如何在PHP中使用`crypt()` 实现用户身份验证。 首先,让我们了解一下`crypt()` 函数。这是一个内置的PHP函数,用于执行单向加密操作。它接受两个参数:`input_string`,即需要加密的明文字符串,以及...
浅析 PHP 中加密函数的应用 ...PHP 中的加密函数在 WEB 开发中的应用非常广泛,无论是在登录页面的密码加密还是在数据传输中的加密处理,PHP 的加密函数都可以发挥其重要作用为用户提供安全的数据传输和存储服务。
描述中提到,“JAVA applet to crypt and decrypt a file (size limitation 1 Ko)”,Java Applet是一种小型的Java程序,可以在用户的Web浏览器中运行。这里,Applet被用于对文件进行加密和解密,但有一个关键的限制...
在PHP开发中,熟练掌握并运用各种内置函数是提升代码效率与质量的关键。以下是对部分PHP函数的深入解析,这些函数覆盖了数学运算、字符串处理、数组操作、文件与目录管理等多个方面,是PHP开发者的必备工具。 #### ...
在PHP编程语言中,了解和熟练使用各种内置函数是至关重要的。这些函数涵盖了广泛的用途,包括数据验证、字符串处理、编码转换等。以下是一些PHP常用函数的详细说明: 1. **验证函数系列**: - `is_object()`: 检查...
《算法风行者:PHP中的OpenSSL与Lib Sodium加密与密码哈希适配器解析》 在信息技术领域,算法扮演着至关重要的角色,它是一系列解决问题或执行特定任务的精确指令。"Algorithm-windwalker-crypt.zip" 文件,正如其...
2. **设置密钥**:在`Crypt.cpp`中找到设置密钥的函数,根据实际需求设定加密密钥。 3. **执行加密/解密操作**:调用SQLite的加密API,对数据库进行加密或解密操作。 4. **测试**:通过创建和查询加密后的数据库,...
在提供的文件内容中,包含了大量PHP编程语言中常用函数的信息。这些函数覆盖了字符串处理、加密、格式化、数组处理等多个方面。下面详细阐述这些知识点: 字符串处理: - `addcslashes` 和 `addslashes` 用于在特定...