2008-10-13 6 views
7

Potrzebuję więc wygenerować kod, który można powiązać z konkretnym użytkownikiem/potencjalnym klientem z wbudowaną kwotą dolara. Musi być odwracalny, aby aplikacja kliencka mogła potwierdzić ważność kodu i zastosować zniżkę, jaką zamierza zarządzać.Generowanie specyficznych dla użytkownika 1 kodu kuponu czasowego

Chciałbym, aby kod był jak najkrótszy, ale musi być dobrze zaciemniony, aby sprzedawcy nie mogli samemu sobie z nim poradzić.

Potrafię wymyślić coś podskakującego wokół liczb, dzieląc przez pi i konwertując na heks i co tam, ale byłbym naprawdę zainteresowany pomysłami lub najlepszymi praktykami ze społeczności.

Robię to w języku C#, ale spodziewam się, że metody z dowolnego języka można przetłumaczyć.

edycja: w celu wyjaśnienia. Nie mogę przechowywać tych rzeczy z wyprzedzeniem, kody muszą być budowane w locie i przenosić wszystkie informacje z nimi.

np. Sprzedawca 14 kontaktuje się z klientem 773 i chce dać mu 500 $ z ich zamówienia. 14, 773 i 500 muszą znajdować się w kodzie kuponu i mogą zostać wyodrębnione w aplikacji klienckiej po kluczyach sprzedawcy w kodzie.

+0

mógłby Pan wyjaśnić protokół tutaj? Wygląda na to, że masz kilka imprez, sprzedawca S, klient (klient?) C, centralna baza danych D i aplikacja klienta A. Kto rozmawia z kim iw jakiej kolejności, a która ze stron mówi, która druga strona ? Bez tego trudno odpowiedzieć na twoje pytanie. –

Odpowiedz

7

Wygeneruj parę kluczy publiczny/prywatny do podpisania. Podpisz cyfrowo kombinację identyfikatora użytkownika i wartości kuponu za pomocą klucza prywatnego. Opublikuj wartość kuponu + podpis jako kod kuponu, zakodowany, na przykład, za pomocą liter i cyfr. Aplikacja kliencka zweryfikuje kod, odtwarzając kombinację danych, które zostały pierwotnie podpisane (np. Przedłużyć identyfikator użytkownika do wartości kuponu), a następnie weryfikując podpis cyfrowy.

+0

Uwaga: nadal musisz mieć punkty sprzedaży informujące, jakie kupony były używane dość często, aby zminimalizować ryzyko dwukrotnego użycia kuponu. – Neall

+0

Oczywiście, zapewnienie, że kod kuponu jest używany tylko raz, pozostaje ćwiczeniem dla czytelnika. Podpisane dane muszą również zawierać więcej informacji, aby można było wydać kilka kuponów o tej samej wartości i dla tej samej kombinacji klienta i przedstawiciela handlowego. – Alexander

+0

Aby uzyskać więcej informacji, przydatne są http://en.wikipedia.org/wiki/Public-key_cryptography i wyszukiwarka Google. – ICR

2

Chciałbym użyć kodu klienta i daty wygaśnięcia kuponu. Jeśli chodzi o weryfikację, można po prostu przechowywać ważne kupony w bazie danych i je sprawdzać. Możesz zeskanować tabelę kuponów raz dziennie, aby wyczyścić wygasłe kody.

+0

Są kraje (takie jak Szwajcaria), w których zgodnie z prawem kupony nigdy nie wygasają (nawet jeśli zazwyczaj mają datę ważności wydrukowaną na kuponie). Zastąp datę ważności przed terminem wydania. –

+0

Podoba mi się ta odpowiedź, ponieważ oferuje dobrą alternatywę dla wszystkich innych odpowiedzi, które opierają się na kryptografii. Jedyną rzeczą, na którą warto zwrócić uwagę na to rozwiązanie, jest to, że nie można zweryfikować kodów kuponów w trybie offline. – Alexander

+0

Lekko czystszym rozwiązaniem prowadzącym do krótszych kodów kuponów jest generowanie całkowicie losowych krótkich identyfikatorów kuponów (np. 8 znaków alfanumerycznych), przechowywanie ich w bazie danych wraz ze wszystkimi istotnymi informacjami na temat kuponu, takimi jak identyfikator klienta, identyfikator rep ID , wartość kuponu, wygaśnięcie ... – Alexander

2

Jak sprytni są twoi sprzedawcy (lub kobiety)? Czy możesz po prostu bazować 64 kodując wartość?

Sprawdź tutaj jak base64 kodowania i dekodowania:

http://arcanecode.wordpress.com/2007/03/21/encoding-strings-to-base64-in-c/

Poza tym chciałbym zaszyfrować wartość z kluczem znanym przez Ciebie i aplikacji klienckiej.

+0

Czasami są zaskakująco sprytni. zwłaszcza, gdy jedzie na nich prowizja. – Echostorm

+0

Następnie szyfrowanie jest drogą, sugestia Treba zadziała. – Arry

5

Brzmi jak obudowa do szyfrowania asymetrycznego. Możesz rozdać każdemu klucz publiczny, dostarczając mu informacji o walidacji kuponu, ale możliwość utworzenia cupona spoczywałaby na właścicielu klucza prywatnego (= ty).

Utworzę klasę kuponów, która serializuje do pliku xml, a następnie zaszyfruje ciąg znaków xml. Sprawdzanie poprawności będzie odszyfrowywać ciąg znaków i sprawdzać, czy jest poprawny xml (zalecam, aby nie deserializować obiektu bez wcześniejszego sprawdzenia).

1

Zgaduję od drogi już sformułowane pytanie nie chcesz, aby zapisać kody w bazie danych (jeśli nie, można po prostu sprawdzić każdy kod w bazie danych)

Więc, co możesz zrobić, to wziąć wszystkie stosowne informacje o tym, co jest w kuponie, a następnie połączyć je z tajną solą, aby zapobiec manipulacjom.

Zatem załóżmy, że chciał kupon o wartości $ 200 można zbudować ciąg jak „23_200” i obliczenia mieszania MD5 z tajnym soli „BillTheLizard” użytkownika 23, aby uzyskać 2671519131e974ee6fc746151e98f4a8, a więc kompletny kod dać klient jest 200_23_2671519131e974ee6fc746151e98f4a8

teraz po otrzymaniu kodu, należy podzielić go od siebie, i sprawdzić, czy md5 („200_23” + tajne) = 2671519131e974ee6fc746151e98f4a8 celu sprawdzenia wartości

EDIT: Jeśli hash 32 znaków jest zbyt długi, zawsze można go skrócić, np przycięcie go do 8 znaków dałoby ci 4294967296 różnych wartości skrótu.

+0

Z mojego doświadczenia wynika, że ​​ludzie (sprzedaż) dołożą wszelkich starań, aby manipulować takim systemem dla osobistych zysków. Na przykład zatrudnią kogoś, aby odkrył sekretną sól z aplikacji klienckiej. Kryptografia asymetryczna jest nieco bardziej niezawodna w tym scenariuszu. – Alexander

+0

MD5 jest podatny na ataki polegające na rozszerzeniu wiadomości: istnieją sposoby, w których sprzedawca może zmodyfikować dane kuponu w sposób, który nie zmienia wynikowego skrótu, aby mógł wziąć kupon i wygenerować inne podobne wyglądające, które są nadal ważne. Bezpiecznym sposobem na zrobienie tego, co sugerujesz, jest użycie istniejącej techniki [Message Authentication Code] (https://en.wikipedia.org/wiki/Message_authentication_code) zamiast tworzenia własnego. Jedną z możliwości, która jest powszechnie dostępna, jest [HMAC] (https://en.wikipedia.org/wiki/HMAC). – hugomg

1

Podsumowując dotychczasowe odpowiedzi. Istnieją dwa główne różne sposoby generowania takich kupon kody:

  1. scentralizowane rozwiązanie: informacja o każdym kuponie są przechowywane w bazie danych. Kod kuponu może być następnie generowany losowo i krótki - jest to po prostu odwołanie do rekordu w bazie danych, który zawiera wszystkie niezbędne informacje, takie jak wartość kuponu, identyfikator klienta, identyfikator rep. Weryfikacja takiego kodu wymaga dostępu online do serwerów.

  2. Rozwiązanie zdecentralizowane: kupon to samodzielna informacja, którą można zweryfikować w trybie offline, bez uzyskiwania dostępu do żadnego z serwerów. W rezultacie kod kuponu musi zawierać niektóre (lub nawet wszystkie) informacje. Najbezpieczniejszym sposobem jest użycie kryptografii asymetrycznej lub Message Authentication Code, aby nikt inny niż posiadacz klucza prywatnego (ty) nie mógł generować kuponów.

1

Steve Gibson mówi o hasło jednorazowe na swojej stronie internetowej, ale nie ma powodu, dlaczego nie można go używać do tworzenia jednym czasie kupon kody: http://grc.com/ppp

Powiązane problemy