生成优惠券代码

时间:2011-11-06 06:58:17

标签: vb.net algorithm

我有五个字段

1.CustomerID

2.BusinessID

3.OfferID

4.购买日

5.购买月份

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位数的防弹优惠券代码????

4 个答案:

答案 0 :(得分:2)

如果我理解正确,您生成一个16位数的代号,然后验证它,您是否使用了某种校验和?

如果有人计算出您的校验和算法,他们就能够生成无限量的优惠券。

我认为最好预先生成几千或几十万(无论多少你需要的)优惠券代码,也许可以让它们一次性使用(通过删除它们或检查它们是否为&#39;已经使用过。)

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

答案 1 :(得分:1)

如果您不希望人们生成或猜测有效的优惠券代码,请考虑使用cryptographic hash function

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

总共11位数。只有5人。

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

以下是我用于散列和加密的函数。确保添加System.Security.Cryptography。您应该添加这些Salt编号,并在程序中存储密码。只是确保用户不会以任何方式阅读。

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