【问题标题】:Hashed password sometimes longer than 128 characters哈希密码有时超过 128 个字符
【发布时间】:2015-08-14 06:08:45
【问题描述】:

我遇到了一个奇怪的安全相关问题,最近我在尝试在 SQL Server 数据库字段 nvarchar(130) 中插入散列密码时经常出现间歇性错误:

<cfqueryparam value="#hashpass#" cfsqltype="cf_sql_char" maxLength="130">

hashpass 变量是这样设置的:

<cfset hashpass =  Hash(arguments.password & getsalt.user_salt, "SHA-512")>

想知道 SHA-512 哈希值怎么可能超过 128 个字符,而文档说它应该始终是 128 个字符?这是 ColdFusion 10 错误:

[Macromedia][SQLServer JDBC Driver][SQLServer]字符串或二进制数据将被截断。

【问题讨论】:

  • (编辑)AFAIK,是的,它应该生成一个 512 位值 / 128 个字符编码为十六进制。发生错误时的实际值是多少?
  • 我希望我知道失败的实际值,当我尝试重现代码有效的错误时。我可以输入一个 try/catch 并通过电子邮件向自己发送失败的值,它经常发生,只是在我尝试时不会发生。
  • 本着try/catch的精神,你的Application.cfc的onError()函数是做什么的?
  • 密码是您在该查询中插入的唯一列吗?您能否发布整个查询和整个错误消息(嗯:我们不需要堆栈跟踪)。为什么要为该列使用 nvarchar,然后使用 char 传递其值?这似乎有点奇怪,不知道?哪个版本的 ColdFusion?
  • 好问题。克里斯 - 你的 CF 版本是什么?对于 CF10+,请使用 cf_sql_nvarchar。 (虽然您可能不需要 nvarchar 类型来存储 HEX)

标签: coldfusion


【解决方案1】:

从您的错误看来,问题出在数据库级别,因为 ColdFusion 没有使您的 maxlength 检查 cfqueryparam 标记失败,并且允许执行查询。我刚刚测试了尝试传递超过maxlength 属性中指定的长度的字符串(在CF10 上)并得到错误:

The cause of this output exception was that: 
coldfusion.tagext.sql.QueryParamTag$InvalidDataException: 
Invalid data value this-is-a-string-that-is-too-long exceeds maxlength setting 10..`

正如问题的 cmets 中提到的Adam Cameron,似乎是您的查询中的另一个字段引发了错误。

由于散列密码的长度为 128 个字符 - 您验证 130 个字符是否有原因?

【讨论】:

  • 谢谢大家,我把错误行号看得太字面意思了......结果这个插入的大部分数据来自另一个表,其中的字段在许多情况下要长一些......因此,调整目标表中的字段大小以匹配。
猜你喜欢
  • 2017-06-07
  • 2012-12-18
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 2015-11-28
  • 2023-04-08
  • 2013-08-16
  • 1970-01-01
相关资源
最近更新 更多