2011-09-03 5 views
2

현재 작업중인 웹 페이지에서 액세스 할 수있는 데이터베이스 리소스에는 auto_increment가 설정된 고유 한 ID 번호가 있습니다. 그래서 URL은 some.web.page.com/resource/ id-number처럼 보일 것입니다.무작위 값으로 보일 숫자를 마스크하는 방법

사용자가 단순히 그가 늘린 숫자를 늘리거나 줄이면 기쁘게하는 것을 얻을 수 있다는 것을 알게 될 것입니다. 보안은 큰 걱정거리는 아니지만, 그런 종류의 행동.

숫자를 임의의 문자열 모양으로 변환하는 기능을 찾으려고했으나 실패했습니다 (google.com에서 해당 필드에 무엇을 넣어야할지 몰랐습니다)). 나에게는 나름의 아이디어가 있지만 이미 어딘가에서 이미 잘 작동하는 방법을 사용하는 것을 선호한다. 이 함수는 대칭 적이기 때문에 문자열을 쉽게 생성 할 수 있고 그 문자열에서 숫자를 얻을 수 있습니다. 어떤 충고?

답변

1

Ray Morgan은 PHP에서 알고리즘과 구현을 제공합니다. 이 알고리즘은 즉, 몇 가지 좋은 특성을 가지고 :

  • 알고리즘이 결정적이다, 즉, 항상 주어진 숫자 ID 값에 대해 동일한 난독 문자열을 생성합니다.
  • 난독은 (만) 난독 값을 알고 있다면, 당신은
  • (예 : 정수의 간단한 증가 시퀀스)를 인식 할 수있는 패턴을 생성하지 않는 기본 숫자 ID를 추출 할 수있다, 즉, 완전히 반전이다 난독 ID 문자열이

아에 따라 임의의 숫자 ($ segment1)을 작성

  • 을 다음과 같이 자체가 기본 단계를 설명 저자 변경되었는지 여부는 감지 할 수 있습니다 $ id의 재.
  • $ segment1의 해시를 기반으로 두 번째 임의의 숫자 ($ segment2)를 만듭니다.
  • $ id 값을 더하거나 빼서 $ segment2를 변경합니다.
  • $ segment1과 변경된 $ segment2에서 세 번째 해시 ($ segment3)를 만듭니다. 이 해시를 사용하면 인코딩 된 ID의 변경을 감지 할 수 있습니다.
  • 세 세그먼트를 문자열로 연결하여
  • 및 voilà - 난독 화 된 ID가 있습니다. 원래 구현은 난독에서베이스 64로 인코딩 된 문자열을 생성 된 것으로,

    #-(and) (ql:quickload "ironclad") 
    #-(and) (ql:quickload "trivial-utf-8") 
    
    (defpackage "HASHID" 
        (:use "COMMON-LISP" "IRONCLAD" "TRIVIAL-UTF-8") 
        (:shadowing-import-from "COMMON-LISP" "NULL")) 
    
    (in-package "HASHID") 
    
    (defparameter +secret+ "Secret Password") 
    
    (defun sha1-hex-digest (string &optional (secret +secret+)) 
        (let ((digest (make-digest :sha1))) 
        (update-digest digest (string-to-utf-8-bytes string)) 
        (update-digest digest (string-to-utf-8-bytes secret)) 
        (let* ((result (produce-digest digest)) 
          (length (length result)) 
          (char-length (* length 2)) 
          (buffer (make-array char-length :element-type 'character)) 
          (digits "ABCDEF")) 
         (loop 
         :with wp := 0 
         :for byte :across result 
         :do (setf (char buffer (prog1 wp (incf wp))) (char digits (ash byte -4))) 
          (setf (char buffer (prog1 wp (incf wp))) (char digits (logand byte 15))) 
         :finally (return buffer))))) 
    
    
    (defun obfuscate-id (identifier) 
        (let* ((segment-1 (subseq (sha1-hex-digest (format nil "~D" identifier)) 0 16)) 
         (segment-2 (subseq (sha1-hex-digest (concatenate 'string segment-1)) 0 8)) 
         (decimal (parse-integer segment-2 :radix 16)) 
         (buried-id (if (< identifier decimal) (- decimal identifier) (+ decimal identifier))) 
         (new-segment-2 (format nil "~8,'0X" buried-id)) 
         (segment-3 (subseq (sha1-hex-digest (concatenate 'string segment-1 new-segment-2)) 0  8))) 
        (concatenate 'string segment-1 new-segment-2 segment-3))) 
    
    
    (defun deobfuscate-id (string) 
        (let* ((segment-1 (subseq string 0 16)) 
         (segment-2 (subseq string 16 24)) 
         (segment-3 (subseq string 24)) 
         (expected-2 (subseq (sha1-hex-digest segment-1) 0 8)) 
         (expected-3 (subseq (sha1-hex-digest (concatenate 'string segment-1 segment-2)) 0 8))) 
        (and (string-equal segment-3 expected-3) 
         (let* ((v1 (parse-integer segment-2 :radix 16)) 
           (v2 (parse-integer expected-2 :radix 16))) 
          (abs (- v1 v2)))))) 
    

    참고 :

  • PHP에 익숙하지 나 같은 사람들을 위해

, 알고리즘의 작업 커먼 리스프 포트처럼 보일 수 있습니다 ID와 실제 값으로 사용. 여기에서는이 단계를 생략했지만 특별히 추가하는 것이 간단해야합니다. your programminglanguage of choicecomes withbase-64 support.

+0

정말 감사합니다. – korda

+0

이 답변에서 해당 기사에 사용 된 코드/구현/알고리즘에 대한 간단한 설명을 작성할 수 있습니다. 유일한 링크 응답은 일반적으로 여기에서 눈살을 찌푸리게됩니다. –

+0

@Lasse - 지금은 아니지만 그렇게 할 수 있습니다. – Dirk

관련 문제