2009-11-18 6 views
0

사용자가 Google 사이트에 등록하면 주소 확인 서비스로 주소를 확인합니다. 이 서비스는 입력 된 주소가 있지만 오류가있는 경우 주소 제안을 반환 할 수 있습니다. 이 sugggestion은 사용자에게 반환됩니다.사용자가 데이터를 변경했는지 확인

사용자는 제안을 수락하고 신뢰할 수 있습니다. 그가 주소를 변경하면 그는 신뢰할 수 없습니다.

사용자에게 표시되는 데이터가 게시 한 데이터와 동일한 지 확인하는 좋은 방법이 있습니까? 주소 데이터의 해시가있는 숨겨진 필드가 필요하다고 생각합니다. 그러나 나는 알고리즘을 받아야한다. 가능한 경우 알고리즘은 대소 문자를 구분하지 않아야합니다.

알고리즘은 변경 방지 일 웨이 해시를 만들어야합니다.

편집 :

이것은 꽤 잘되었습니다. 나는 여전히 umlaute (ä, ü)로 테스트해야한다.

   StringBuilder addressData = new StringBuilder(); 
      addressData.Append(FirstName); 
      addressData.Append(LastName); 
      addressData.Append(StreetNumber); 
      addressData.Append(StreetName);    
      addressData.Append(City); 
      addressData.Append(CountryISO); 
      addressData.Append(Zip); 
      string stringVal = addressData.ToString().ToLower(); 

      System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
      byte[] keyByte = encoding.GetBytes(ApplicationConfiguration.ShaKey); 
      byte[] messageBytes = encoding.GetBytes(stringVal); 

      HMACSHA256 hmacsha256 = new HMACSHA256(keyByte); 
      byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); 
      string hash = ByteToString(hashmessage); 

      return hash 

답변

1

HMAC (Hash-based Message Authentication Code) 사용 - HMAC는 정확하게이 목적으로 발명되었습니다. 대칭 키를 사용하여 데이터를 인증합니다. 나는 .NET에 익숙하지 않지만 표준 라이브러리는 System.Security.Cryptography.HMAC에서 상속받은 많은 클래스를 제공하는 것 같다. HMAC는 해시 길이 확장 공격 인 에 취약하지 않으므로 일반 해시보다 좋습니다.

HMACSHA256은 좋은 후보자처럼 보입니다. 당신은 재생 공격을 방지 않도록하려면

또한 unique value (a nonce) 문자열을 추가하는 것을 고려한다 - 그렇지 않으면 사용자가 동반 이전 HMAC 서명과 함께 이전 이메일을 다시 보낼 수 있습니다.

HMAC 키는 서버 측 비밀이어야합니다.

0

사용자에게 표시되는 데이터가 자신이 게시 데이터와 동일한 을 있는지 확인하는 좋은 방법이 있나요?

예 - 귀하는 사용자에게 보내는 데이터를 데이터베이스에 저장할 수 있습니다.

사용자가 양식을 제출하면 데이터베이스에있는 데이터를 사용자가 제공 한 데이터와 비교하십시오. 데이터를 CRC32 해시로 변환 할 수 있지만 해시 문자열 비교를 선택하는 경우 동일한 방식으로 다른 데이터 개체를 연결하는 것이 중요합니다.

편집 : 나는 데이터가 어쨌든 데이터베이스에 저장되어 있기 때문에 오랫동안 해시 문자열을 만드는 것은 쓸모가 없다고 생각합니다.

+0

CRC32는 변조 될 수 있습니다. 안전한 원 웨이 해시가 필요합니다. –

+0

@Mathias Fritsch : MD5를 고려하십시오. – Dor

0

나는 당신의 생각을 좋아한다. 주소 부분을 하나의 큰 문자열로 연결하고 ToLower 버전의 문자열의 GetHashCode를 수행한다. 그런 다음 동일한 방법을 사용하여 비교하십시오.뭔가 변경 한 경우 자바 스크립트가 허용되는 경우

0

, 어쩌면 당신이 jQuery를 변경() 이벤트를 사용하여 클라이언트 측 숨겨진 값을 설정하여이를 확인할 수 있습니다 알고 :

변경 이벤트가 발생을 제어 을 잃을 때 입력 포커스와 값 이 포커스를 얻은 후 수정되었습니다.

$("input[type='text']").change(function() { 
    //do something here, maybe set a hidden value 
}); 

그런 다음 컨트롤러에서이 숨겨진 가치를 확인하실 수 있습니다, 또는 어쩌면 당신은 공상 갈 수있는, 바로 몇 가지 아약스와 값을 확인,하지만 어쩌면 때문에 보안 요구 사항이 위험 할 수 있습니다.

+0

자바 스크립트는 옵션이 아닙니다. 사용자가 여전히 서버에 반환 된 데이터를 조작 할 수 있기 때문입니다. –

+0

글쎄 그건 정말로 문제가되는데 ... 나는 여기에 쉬운 방법이 있다고 생각하지 않는다. 만약 당신이 해가 질 때 소금을 뿌리면, 장소 당 소금 한 개와 해시 (소금 + 장소)를 저장해야한다. SHA-1에서 소금에 절인 패스워드와 같다. 그러나이 경우에 어떤 값이 선택된 값인지 알 수 없기 때문에 이것은 중복됩니다. 우리는 ID (로그인의 경우 사용자 이름)와 같은 다른 것을 필요로합니다. 이는 우리가 선택할 소금을 정확히 알려주고, 이것은 숨겨진 값인 양방향 해시 형식이어야합니다. 또 다른 가능한 옵션은 어떻게 든 사용자 세션에서 키를 저장하고 POST 된 값을 비교하는 데 사용합니다. – JOBG

+0

HMAC를 사용하고 작업을 완료 할 수 있다면 잠재적 인 보안 결함이있는 바퀴를 다시 만들어보십시오. 암호화를 암호 작성자에게 맡깁니다. – intgr

관련 문제