2014-02-19 94 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