2014-02-19 93 views
0

我正在尝试创建一个临时登录链接URI来用于单独使用mysql来获取对安全区域的“可见”访问。这个想法是将一个字段的值设置为给定的sha1值。MYSQL从SHA1生成登录哈希值

sha1值将通过连接一对随机字段和一个salt来确定。 (我不确定这是否是一种好的做法)

以下返回一个语法错误,我相当肯定在子查询中使用相同的表名。有没有一个明智的方法来实现这一目标?我可以在PHP中做到这一点,但我正在努力开发自己的SQL技能。

对'最佳实践'的任何建议也赞赏。

update rsvp set rsvp.rsvpViewHash = sha1(select sha1(concat(rsvp.rsvpURLSlug, rsvp.rsvpCreated, 'salt')) from rsvp); 
+0

尝试更新rsvp set rsvp.rsvpViewHash = cast(sha1(concat(rsvp.rsvpURLSlug,rsvp.rsvpCreated,'salt'))as char(40))来自rsvp);' –

回答

1

两个问题:

  1. 你被散列的两倍。如果您担心散列的安全性,请使用其他算法。已知SHA1不适用于加密应用程序,因此请使用SHA256。
  2. 你的子查询没有条件,所以它会试图在表中的每一行上连接和sha1,可能不是你想要的。这也可能是语法错误的来源;一个返回多行的子查询可能不是sha1()的合适参数,但我不太熟悉mysql知道这个事实。

在任何情况下,根本不需要子查询。简化像这样:

UPDATE rsvp 
SET 
    rsvpViewHash = CAST(sha1(concat(rsvpURLSlug, rsvpCreated, 'salt')) AS CHAR(10000) CHARACTER SET utf8) 
WHERE 
    -- conditions 
; 

EDITED从团块到char

角色SHA结果;假设目标字段rsvpViewHash能够存储CHAR(10000)

+0

sha1函数貌似返回一个blob。因此可能想要将其转换为char。演员似乎返回40 char十六进制字符串。 –

+0

感谢您的提示;更新了答案 – Palpatim

+0

谢谢@Palpatim我已经做了两次sha1的双重错误(这根本不是故意的),但也从来没有想过可以使用当前记录的列设置值而不需要子查询。这工作完美,感谢您的帮助。 – kirgy