0

因此,我正在构建一个需要访问最初为 asp.net 创建的数据库的站点。我想使用与已在数据库中的 asp.net 站点相同的用户名和密码。开发者提到在asp.net中使用了默认的身份验证。

来自数据库的示例密码:sYWPXNvJlVNs8EVZvIQOSaWfQ4I=

来自数据库的示例 PasswordSalt:ruNTdhelY57ghQsTFz/TIg==

这是我尝试过的:

<cfquery name="auth" datasource="ct">
SELECT userid, Password, PasswordSalt from dbo.aspnet_Membership
WHERE userid = '#auth1.userid#'
</cfquery>

<cfset cfHash = toBase64(hash(auth.PasswordSalt & cookie.password, "SHA1"))>

<cfif cfHash eq auth.Password> ...then authenticate etc.

我已经尝试了几次迭代,但是不行,生成的 cfHash 最终会太长,如下所示:

OUJBOUJENjI0MzEzNjM3M0EwQjk3Nzc3ODIzNUVGMkJCODczOEI0Qg==

有任何想法吗?

4

1 回答 1

1

(编辑:原始答案并非在所有情况下都有效。大幅修改......)

这个线程可能是你所追求的。总而言之,两个主要区别是:


<cfscript>
    thePassword = "password12345";
    base64Salt = "l+g9MUcs+cLExeDTNy8M+A==";
    // extract bytes of the salt and password
    saltBytes = binaryDecode(base64Salt, "base64");
    passBytes = charsetDecode(thePassword, "UTF-16LE" );

    // next combine the bytes. note, the returned arrays are immutable, 
    // so we cannot use the standard CF tricks to merge them    
    ArrayUtils = createObject("java", "org.apache.commons.lang.ArrayUtils");
    dataBytes = ArrayUtils.addAll( saltBytes, passBytes );

    // hash binary using java
    MessageDigest = createObject("java", "java.security.MessageDigest").getInstance("SHA-1");
    MessageDigest.update(dataBytes);    
    theBase64Hash = binaryEncode(MessageDigest.digest(), "base64");

    WriteOutput("theBase64Hash= "& theBase64Hash &"<br/>");
</cfscript>
于 2012-11-10T13:24:10.770 回答