2011-11-06 220 views
-1

我有五个字段生成优惠券代码

购买4.Day的1.CustomerID

2.BusinessID

3.OfferID

5.Month购买

Private Function MakeCouponCode(ByVal sn As Int16) As String 
     Dim a(16) As Char 
     Dim chk As Int16 
     Dim check, tDate, slNo, couponCode As String 

     '..............................setting customerID 
     If HFCustID.Value.Length = 1 Then 
      HFCustID.Value = "00" & HFCustID.Value 
     ElseIf HFCustID.Value.Length = 2 Then 
      HFCustID.Value = "0" & HFCustID.Value 
     End If 

     '..............................setting businessID 
     If HFBusiID.Value.Length = 1 Then 
      HFBusiID.Value = "0" & HFBusiID.Value 
     End If 

     '..............................setting offerID 
     If HFOfferID.Value.Length = 1 Then 
      HFOfferID.Value = "0" & HFOfferID.Value 
     End If 

     '..............................setting todays date as ddmm 
     If Today.Day.ToString.Length = 1 Then 
      tDate = "0" & Today.Day.ToString 
     Else 
      tDate = Today.Day.ToString 
     End If 
     If Today.Month.ToString.Length = 1 Then 
      tDate = tDate & "0" & Today.Month.ToString 
     Else 
      tDate = tDate & Today.Month.ToString 
     End If 

     '...............................calculating and setting the check digits 
     If sn < 10 Then 
      slNo = "0" & Convert.ToString(sn) 
     Else 
      slNo = Convert.ToString(sn) 
     End If 

     '...............................calculating and setting the check digits 
     chk = Convert.ToInt16(HFCustID.Value) + Convert.ToInt16(HFCustID.Value) + Convert.ToInt16(HFOfferID.Value) + Today.Day + Today.Month + sn 
     check = Convert.ToString(chk) 
     If check.Length = 1 Then 
      check = "00" & check 
     ElseIf check.Length = 2 Then 
      check = "0" & check 
     End If 

     '...............................concatenate all for coupon code 
     couponCode = HFCustID.Value & HFBusiID.Value & HFOfferID.Value & tDate & slNo & check 
     Return couponCode 
    End Function 

我正在使用上面的代码来制作CouponCode ...但不知何故,它不是很难破解...任何想法如何使不超过16位数的防弹优惠券代码?

回答

2

如果我正确理解你,你生成一个16位数的coup代码,然后验证它,你使用的是一种校验和?

如果有人知道您的校验和算法,他们将能够生成无限优惠券。

我认为最好预先生成数千或数十万(不过需要多少)优惠券代码,并可能让它们一次性使用(删除它们或检查它们是否已被使用)。

当然......这取决于你的需求。很多网站都有简单易记的无限使用优惠券代码,只是为了诱骗人们认为他们正在达成交易。

+0

这是一个好主意..谢谢..但我不知道我是否想这样做。再次感谢。 –

+0

任何想法如何生成唯一的随机数? –

+0

@SifyJuhy:随机,是的。独特的随机...不确定。你可以随时选择一个新号码,如果你得到一个已经被使用的号码(把它们放在HashSet中),但我不确定这是最有效的方法。 – mpen

0

一种选择是使用散列函数。在wikipedia上可以找到它们的各种散列大小和用途的完整列表。有16位数字,你正在看64位散列函数,我不会称之为防弹。

0

1.CustomerID我想至少3位数 2.BusinessID可能是2位数 3.OfferID 2位数? 4.购买日期2位 5.购买月数2位

所以共计11位数字。剩下的只剩5件。

我会创建一个更长的代码,然后将它分成两部分 1.部分是您列出的所有信息。如果你喜欢,你可以通过做一些奇怪的计算伪加密它们。只有重要的是,你仍然可以轻松地阅读它们 2.部分是来自第一部分的加密散列。 (第一部分,使用散列函数,使用只有你知道的密码加密散列结果) 如果有人输入优惠券,则可以无故障地读取所有字段,其余字段用于验证它是有效的优惠券。再次计算哈希值并对其进行加密,然后检查您的计算结果是否相同。我会至少使用5位数字进行验证。

以下是我用于散列和加密的功能。确保添加System.Security.Cryptography。您应该添加这些盐号,并在程序中存储密码。只要确保它不会被用户以任何方式读取。

Imports System.Security.Cryptography 
Imports System.Security 
Imports System.Net.Sockets 
Imports System.Text 
Imports System.IO 
Imports System 

Namespace Crypt 

    Module Hash 

    Function MD5hash(ByVal data() As Byte) As Byte() 
     ' This is one implementation of the abstract class MD5. 
     Dim md5 As New MD5CryptoServiceProvider() 

     Dim result As Byte() = md5.ComputeHash(data) 

     Return result 
    End Function 

    ' Hash an input string and return the hash as 
    ' a 32 character hexadecimal string. 
    Function getMd5Hash(ByVal input As String) As String 
     ' Create a new instance of the MD5CryptoServiceProvider object. 
     Dim md5Hasher As New MD5CryptoServiceProvider() 

     ' Convert the input string to a byte array and compute the hash. 
     Dim data As Byte() = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input)) 

     ' Create a new Stringbuilder to collect the bytes 
     ' and create a string. 
     Dim sBuilder As New StringBuilder() 

     ' Loop through each byte of the hashed data 
     ' and format each one as a hexadecimal string. 
     Dim i As Integer 
     For i = 0 To data.Length - 1 
     sBuilder.Append(data(i).ToString("x2")) 
     Next i 

     ' Return the hexadecimal string. 
     Return sBuilder.ToString() 
    End Function 


    ' Verify a hash against a string. 
    Function verifyMd5Hash(ByVal input As String, ByVal hash As String) As Boolean 
     ' Hash the input. 
     Dim hashOfInput As String = getMd5Hash(input) 

     ' Create a StringComparer an compare the hashes. 
     Dim comparer As StringComparer = StringComparer.OrdinalIgnoreCase 

     If 0 = comparer.Compare(hashOfInput, hash) Then 
     Return True 
     Else 
     Return False 
     End If 

    End Function 

    End Module 

    Module Crypto 

    ''' <summary> 
    ''' Encrypts data with Hash from passToHash 
    ''' </summary> 
    ''' <param name="data"></param> 
    ''' <param name="passToHash"></param> 
    ''' <returns></returns> 
    ''' <remarks></remarks> 
    Function EncryptWithHash(ByVal data As String, ByVal passToHash As String) As String 
     Dim _hash As String = getMd5Hash(passToHash) 
     Dim _result As String = Encrypt(data, _hash) 
     Return _result 
    End Function 

    ''' <summary> 
    ''' Decrypts data with Hash from passToHash 
    ''' </summary> 
    ''' <param name="data"></param> 
    ''' <param name="passToHash"></param> 
    ''' <returns>can throw exception</returns> 
    ''' <remarks></remarks> 
    Function DecryptWithHash(ByVal data As String, ByVal passToHash As String) As String 
     Dim _hash As String = getMd5Hash(passToHash) 
     Dim _result As String = Encrypt(data, _hash) 
     Return _result 
    End Function 

    ''' <summary> 
    ''' Creates a hash and encrypts it 
    ''' </summary> 
    ''' <param name="data"></param> 
    ''' <param name="password"></param> 
    ''' <returns></returns> 
    ''' <remarks></remarks> 
    Function SigCreate(ByVal data As String, ByVal password As String) As String 
     Dim _hash As String = getMd5Hash(data) 
     Dim _crypt As String = Encrypt(_hash, password) 
     Return _crypt 
    End Function 

    ''' <summary> 
    ''' Verifies, if the encrypted Hash is valid 
    ''' </summary> 
    ''' <param name="data"></param> 
    ''' <param name="password"></param> 
    ''' <param name="enc"></param> 
    ''' <returns></returns> 
    ''' <remarks></remarks> 
    Function SigCheck(ByVal data As String, ByVal password As String, ByVal enc As String) As Boolean 
     Try 
     Dim _dec As String = Decrypt(enc, password) 
     Return verifyMd5Hash(data, _dec) 
     Catch ex As Exception 
     End Try 
     Return False 
    End Function 

    Private Salt As Byte() = {51, 39, 204, 201, 190, 167, 217, 190, _ 
            56, 110, 254, 186, 23, 56, 117, 222, _ 
            214, 32, 28, 16, 27, 23, 31, 211, _ 
            101, 92, 143, 234, 45, 63, 75, 82} 

    ''' <summary> 
    ''' Encrypts Data with the given password 
    ''' </summary> 
    ''' <param name="Data"></param> 
    ''' <param name="Password"></param> 
    ''' <returns></returns> 
    ''' <remarks></remarks> 
    Function Encrypt(ByVal data As String, ByVal password As String) As String 
     Dim pdb As New Rfc2898DeriveBytes(password, Salt) 
     Dim alg As Rijndael = Rijndael.Create() 
     alg.Key = pdb.GetBytes(32) 
     alg.IV = pdb.GetBytes(16) 

     Dim ms As New IO.MemoryStream 
     Dim cs As New CryptoStream(ms, alg.CreateEncryptor, CryptoStreamMode.Write) 
     cs.Write(System.Text.Encoding.Default.GetBytes(data), 0, data.Length) 
     cs.Close() 
     ms.Close() 
     Return Convert.ToBase64String(ms.ToArray) 
    End Function 

    ''' <summary> 
    ''' Decrypts Data with the given password 
    ''' </summary> 
    ''' <param name="Data"></param> 
    ''' <param name="Password"></param> 
    ''' <returns></returns> 
    ''' <remarks>can throw exception</remarks> 
    Function Decrypt(ByVal data As String, ByVal password As String) As String 
     Dim pdb As New Rfc2898DeriveBytes(password, Salt) 
     Dim alg As Rijndael = Rijndael.Create() 
     alg.Key = pdb.GetBytes(32) 
     alg.IV = pdb.GetBytes(16) 

     Dim ms As New IO.MemoryStream 
     Dim cs As New CryptoStream(ms, alg.CreateDecryptor, CryptoStreamMode.Write) 
     cs.Write(Convert.FromBase64String(data), 0, Convert.FromBase64String(data).Length) 
     cs.Close() 
     ms.Close() 
     Return System.Text.Encoding.Default.GetString(ms.ToArray) 
    End Function 

    End Module 

End Namespace