我有一个登录验证系统,数据库中的密码存储为SHA-384。当我包含哈希函数时,下面的登录脚本什么也不做。我哪里错了?Coldfusion:验证散列密码
我使用的是MSSQL Server 2008 R2中,ColdFusion的10
loginform.cfm
<cfif IsDefined("FORM.email")>
<cfset redirectLoginSuccess="admin.cfm">
<cfset redirectLoginFailed="login.cfm">
<cfquery name="UserAuth" datasource="sql1007539">
SELECT email,userPass FROM customers WHERE email=<cfqueryparam value="#FORM.email#" cfsqltype="cf_sql_clob" maxlength="255">
AND userPass=<cfqueryparam value="#Hash(form.userPassword, "SHA-384")#" cfsqltype="cf_sql_clob" maxlength="255">
</cfquery>
<cfif UserAuth.RecordCount NEQ 0>
<cftry>
<cflock scope="Session" timeout="30" type="Exclusive">
<cfset Session.Username=FORM.email>
<cfset Session.UserAuth="">
</cflock>
<cfif IsDefined("URL.accessdenied") AND true>
<cfset redirectLoginSuccess=URL.accessdenied>
</cfif>
<cflocation url="#redirectLoginSuccess#" addtoken="no">
<cfcatch type="Lock">
</cfcatch>
</cftry>
</cfif>
<cflocation url="#redirectLoginFailed#" addtoken="no">
<cfelse>
<cfset LoginAction=CGI.SCRIPT_NAME>
<cfif CGI.QUERY_STRING NEQ "">
<cfset LoginAction=LoginAction & "?" & XMLFormat(CGI.QUERY_STRING)>
</cfif>
</cfif>
编辑:如果不使用HASH函数的脚本工作。 编辑:我也可以确认密码存储在SHA-384中。我检查了使用下面的HASH标识符:duncanwinfrey.com/tools/hashid/hash.php
编辑29/05/13
**代码返回错误,当我删除cfparam标签**
<cfquery name="UserAuth" datasource="sql1007539">
SELECT email,userPass FROM customers WHERE email="#FORM.email#"
AND userPass="#hash(form.userPassword, "sha-384")#"
</cfquery>
返回错误
它什么都不做?你看到了什么?它是否加载?你可以提交吗?您是否验证了参数正在进入服务器页面?当你说它的工作没有哈希,这意味着你成功登录?如果这是原因,那么您的密码可能不会在数据库中散列。检查你的客户表:如果你能以纯文本的方式读取密码,那么密码就不会被散列。在查找它们之前调用它们的散列函数将不起作用。如果你想让它们被散列,你必须计算散列并将其存回表中。 –
您是否尝试过从数据库输出userPass字段,并通过调用hash()密码的结果进行比较?通常这些问题是由数据保存方式引起的。例如,如果可以使用base64或其他格式。尝试保存“密码”的密码,然后用你在SQL中看到的内容更新你的问题,以及你从CF的散列函数中得到的内容。这可能会给我们一些工作 – barnyr
@Patrick M,如果我使用的形式工作:userPass = 。我可以用一个虚拟账户登录,该账户存储在数据库中,不需要加密。 –