移動加密那點事兒_值儲存加密

weixin_34067049發表於2015-07-16

本文章講述利用cocos2d-x 開發手機遊戲的一些加密心得。

如有問題,請多指正。

很多其它資訊詳見:http://blog.csdn.net/chengyingzhilian/article/details/25540441

本文地址:http://blog.csdn.net/chengyingzhilian/article/details/25957895

好了,進入本文的主題——資料加密

  要將資料加密,不得不提的一款神器:八門神器。手機遊戲中的金手指。
  八門神器是安卓、iOS、塞班平臺上通用的遊戲改動工具,能夠改動記憶體中的數值和引數,達到改動遊戲HP、MP、金錢、等級等的作用。八門神器類似於PC平臺的金山遊俠等遊戲改動器。
  對於網路遊戲來說,可能沒有太大的影響,終端對於網遊來說基本上是一快螢幕,全部的資料都存放在server上。本機僅留部分配置資訊等無關重要的資料。可對於單機來說,意義就不一樣了,沒有網路無法驗證資料的正確,非常easy被記憶體改動器改動了資料。

  因此,我們須要對我們用到的資料記憶體進行加密,防止記憶體被改動。
  對資料加密基本可分為兩種:
  1. 可逆加密
  2. 不可逆加密
  兩種加密也相應著不同的資料加密設計思想。

 首先要了解八門神器的使用基本步驟:

  • 1.發現介面上的資料,進入八門神器進行查詢。
  • 2.更新介面上的資料,進入八門神器進行在上一步驟結果中繼續檢索。

  • 3.反覆步驟2,直到結果僅僅是固定的地址。
  • 4.改動該記憶體,更新介面檢視資料是否正確。

先說可逆加密:

  不知道你發現上面八門神器使用步驟中,加紅的文字沒有。這就是可逆加密的關鍵。

  首先要明白的一點就是 顯示的資料 ~= 記憶體的資料。

  這就是可逆加密的中心思想。

  將記憶體中的資料加密起來。在顯示的時候解密就可以。
  使用一個最簡單的可逆演算法,實現加密和解密2個方法,然後對你覺得有必要保護的記憶體進行儲存前加密,取前解密。
  可逆的加密演算法:最典型的可逆加密演算法是異或運算。大家都知道,對一個值連續異或兩次,其結果還是原值;於是,第一次異或被看成是加密,第二次異或被看成是解密。

  本文不是介紹加密演算法,僅僅是介紹基本思路,關於高階的加密演算法可自行搜尋。在此僅適用一種簡單的演算法來演示。
  記憶體 * 2
  驗證方式非常簡單: 從1 開始,每次遞增1。

利用八門神器非常easy就能改動掉

   那麼我們使用簡單演算法:
  • 儲存記憶體 = (儲存記憶體 / 2) * 2
  • 顯示內容 = 儲存記憶體 / 2 
public class MainActivity extends Activity {
	TextView showTextView = null;
	int index = enNum(1);

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		showTextView =(TextView)findViewById(R.id.textView2);
		showTextView.setText(""+deNum(index));
	}

	public void addNum(View view)
	{
		index = enNum(deNum(index)+1);
		showTextView.setText(""+deNum(index));
	}


public static int enNum(int num){
	return num*2;
	
}

public static int deNum(int num){
	return num/2;
	}
}


簡單吧。
 
以下我們進行八門神器搜尋:
在輸入1 之後搜尋: 出現 202397 個資料。
點選button之後,搜尋 2 還是有大量資料。

多次點選button之後。搜尋的結果就會漸漸降低。

之後就發現不了了。


那麼我們利用 顯示內容 = 儲存記憶體 / 2  的演算法。搜尋 顯示 * 2 的記憶體,多次之後就非常easy發現該記憶體。

改動之後,記憶體成功變化。可見加密演算法的重要性。使用簡單的演算法,非常easy暴力掉。

接下來我們看看不可逆加密的方式:

不可逆的加密演算法:MD5 驗證 比如RSA公司發明的MD5演算法,以及由美國國家標準局建議的不可逆加密標準SHS(Secure Hash Standard。安全雜湊資訊標準)等。
  基本上就是:
顯示記憶體 = 儲存記憶體 
將儲存記憶體加密 儲存在驗證變數中。
只是在每次顯示/使用記憶體之前,對你加密與驗證變數對照,這樣就能非常easy發現是否記憶體被改動,是否應該採取措施等等。

if (md5(index).equals(enIndex)){
				index++;
				enIndex = md5(index);	
				showTextView.setText(""+index);
			}
			else
				System.err.println("err index changed!!!");



版權宣告:本文部落格原創文章。部落格,未經同意,不得轉載。

相關文章