2016-04-13 30 views
1

我想將軟件許可證密鑰存儲在我的mysql數據庫的某個字段中,但我希望將許可證號存儲爲加擾格式,以便如果數據庫已損壞,許可證密鑰將無法使用。我想將軟件許可證密鑰打入/從mysql數據庫解密/解密

有3種可能的情形與許可鍵:

  1. 它可以爲null - 一些用戶將不必存儲在數據庫中還沒有許可證密鑰。
  2. 它可能是一個25位許可證,與由連字符分隔的每5個字符:例如:ABCD1-EFGH2-IJKL3-MNOP4-QRST5
  3. 它可能是一個10位許可證,所有這些都是數字和有沒有分隔符:例如:1234567890

我想在存儲之前將許可證加擾,然後在登錄後向用戶顯示時再次運行相同的加擾函數以解密許可證。

我想我需要先檢查許可證的大小。

  1. 如果0,則什麼也不做。我可以在加載函數之前檢查它是否爲null。
  2. 如果是29,則使用連字符分隔符對許可證的各個部分進行洗牌,例如2nd & 4th,也許可以使用str_rot13更改字母字符。
  3. 如果是10,請選擇第3,5,7,&第9個字符並更改它們的順序。如9日和5日,7日。

我設置如下:

function scramble($scramblestr) { 

    // check string length 
    $length = strlen($scramblestr); 

    // if 10 digit license (all numbers) 
    if ($length == 10) { 
     $1st = substr($scramblestr, 0, 1); 
     $2nd = substr($scramblestr, 1, 1); 
     $3rd = substr($scramblestr, 2, 1); 
     $4th = substr($scramblestr, 3, 1); 
     $5th = substr($scramblestr, 4, 1); 
     $6th = substr($scramblestr, 5, 1); 
     $7th = substr($scramblestr, 6, 1); 
     $8th = substr($scramblestr, 7, 1); 
     $9th = substr($scramblestr, 8, 1); 
     $10th = substr($scramblestr, 9, 1); 

     // swap 3rd character with 7th/swap 5th character with 9th 
     $scramblestr = $1st . $2nd . $7th . $4th . $9th . $6th . $3rd . $8th . $5th . $10th; 

    // if 25 digit license (with hyphen separators) 
    } elseif ($length == 29) { 
     $scramblestr = array_filter(explode('-', $scramblestr), 'strlen'); 

     // swap 2nd & 4th sections 
     $scramblestr = $scramblestr[0] . "-" . $scramblestr[3] . "-" . $scramblestr[2] . "-" . $scramblestr[1] . "-" . $scramblestr[4]; 

     // swap alpha characters 13 places in the alphabet 
     $scramblestr = str_rot13($scramblestr); 

    // if null or if stored incorrectly (for example if the license is not null but contains an invalid number of characters) 
    } else { 
     $scramblestr = "Unknown"; 
    } 

    return $scramblestr; 
} 

然而,這會導致以下服務器500錯誤:

PHP Parse error: syntax error, unexpected '1' (T_LNUMBER), expecting variable (T_VARIABLE) or '$'

這點,第一SUBSTR參考。但是,根據php.net,它應該是一個整數,用於在此處指定字符串的長度。

任何想法?

或者是否有更有效的方法來執行此操作?還是有沒有人有其他可能適合的方法?

+0

不太清楚:但是一個變量不能被(部分)的數字,可以嗎? – CaptainCarl

+0

你爲什麼不把它散列呢? – Daan

+0

請參閱答案[這裏](http://stackoverflow.com/questions/16600708/how-do-you-encrypt-and-decrypt-a-php-string) – LMS94

回答

6

"@Fred & CaptainCarl you were both right, how could I of not realised that... changed the $st to $first and so on... – BottyZ"

提交作爲一個答案:

這裏的問題是,你的變量以數值;不能這樣做。做一些像$a1st而不是$1st,而以字母開頭。在堆棧

參考,你可以有一個讀:

+0

讓我回到我的榮譽!不,我很高興它解決了。 – CaptainCarl

+1

@CaptainCarl我有;-) –

+0

感謝您的幫助。 – BottyZ