我的网络应用程序是用CF8编写的。编写原始程序的程序员早已不复存在了。让我没有任何文件。 当我需要在登录操作页面上工作时,我发现一个问题,前一个程序员没有使用CF来处理传入的密码但是在C / C ++中使用了可执行文件。用户的密码被传递给这个可执行文件,据我所知,这个程序将使用MD5算法对用户密码进行哈希处理。
为了使其更复杂,这个散列密码与点网络网络应用程序使用的数据库中存储的散列密码匹配。点网应用。是我们的主要网络应用程序。,CF8应用程序是点网络的补充应用程序。我们的用户使用这两个应用。可互换地使用相同的用户名和密码。
我有一个转换CF8应用程序的任务。 (安装在Solaris中),CF10(在新的Linux服务器中)和C / C ++可执行文件不再适用于Linux。换句话说,我不能再使用此可执行文件来散列用户密码。由于我没有足够的知识来转换和操作C / C ++程序,我计划在CF10中创建类似的功能。 我的问题是,我需要在CF10中做些什么,这样我的程序才能生成由dot net web app(存储在数据库中)创建的相同散列密码。
我做了以下但是我的回复了一个不同的哈希密码。此密码不能用于登录我的两个Web应用程序中的任何一个,因为散列密码与存储在DB中的密码不匹配。
<cfset password = "#Trim(MyPWD)#" />
<cfset crypto = createObject("component", "cfcomponents.md5_crypto") />
<cfset salt = crypto.genSalt() />
<cfset X = crypto.CHash(password,salt) />
<cfdump var="#Trim(X)#"> <!--- I got a different hasked password --->
<!--- My component: md5_crypto.cfc --->
<cfcomponent displayname="CF10_PWdHash">
<cffunction name="CHash" access="public" returntype="String">
<cfargument name="password" type="string" />
<cfargument name="salt" type="string" />
<cfargument name="iterations" type="numeric" required="false" default="16" />
<cfargument name="algorithm" type="string" required="false" default="MD5" />
<cfscript>
var hashed = '';
var i = 1;
hashed = hash( password & salt, arguments.algorithm, 'UTF-8' );
for (i = 1; i <= iterations; i++) {
hashed = hash( hashed & salt, arguments.algorithm, 'UTF-8' );
}
return hashed;
</cfscript>
</cffunction>
<cffunction name="genSalt" access="public" returnType="string">
<cfargument name="size" type="numeric" required="false" default="16" />
<cfscript>
var byteType = createObject('java', 'java.lang.Byte').TYPE;
var bytes = createObject('java','java.lang.reflect.Array').newInstance(
byteType , size);
var rand = createObject('java', 'java.security.SecureRandom').nextBytes
(bytes);
return toBase64(bytes);
</cfscript>
</cffunction>
</cfcomponent)
我看到C / C ++程序有以下代码:
#include "md5.h"
#include <stdio.h>
#include <string.h>
#define SALT "J@kaR@ta"
/*
* Purpose: this routine calculates and md5 hash based on the first
* argument passed returns the first 15 hex characters
* of that hash
*/
void main(int argc, char* argv[], char* envp[])
{
char pass_and_salt[256];
char password_hash[256];
char connect_string[256];
sprintf(pass_and_salt, "%s%s", argv[1], SALT);
encryptMD5(pass_and_salt, password_hash);
//fprintf(stderr, "hash=%s\r\n", password_hash);
fflush(stderr);
printf("%s\n", password_hash);
}
有人可以帮忙吗?