2014-02-19 2 views
0

mysql을 단독으로 사용하여 보안 영역에 대한 "가시적 인"액세스를 얻는 데 사용할 임시 로그인 링크 URI를 만들려고합니다. 아이디어는 필드 값을 주어진 sha1 값으로 설정하는 것입니다.MYSQL이 SHA1에서 로그인 해시를 생성합니다.

sha1 값은 몇 개의 임의 필드와 소금을 연결하여 결정됩니다. (이것이 좋은 연습인지 확실하지 않습니다.)

다음은 하위 쿼리에서 동일한 테이블 이름을 사용하는 것과 관련하여 상당히 틀린 구문 오류를 반환합니다. 이것을 달성하는 합리적인 방법이 있습니까? PHP에서이 작업을 수행 할 수 있지만 자체 SQL 기술을 개발하려고합니다.

'권장 사항'에 대한 권장 사항도 인정됩니다.

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

을 저장할 수 있다고 가정합니다.'update rsvp.setvpViewHash = cast (sha1 from 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 
; 

가 숯불하는 BLOB에서

캐스트 SHA 결과를 편집 한 목적지 필드가 rsvpViewHash 인 경우 CHAR (10000)

+0

sha1 함수는 외관상 blob을 반환합니다. 따라서 그것을 char로 변환 할 수 있습니다. 캐스트가 40 자의 16 진수 문자열을 반환하는 것으로 보입니다. –

+0

메모 주셔서 감사합니다; 대답을 – Palpatim

+0

고맙습니다 @ Palpatim 나는 sha1의 두 번 실수로 두 번 (이것은 의도적으로 전혀 아니 었어)뿐만 아니라 하위 쿼리에 대한 필요없이 현재 레코드의 열을 사용하여 값을 설정할 수 있다고 생각 못 했어. 이것은 완벽하게 도움이되었습니다. – kirgy

관련 문제