소곤소곤 ad

2014년 6월 17일 화요일

구글플레이 안드로이드 인앱결제 보안 이야기 #3 (public Key)

페이스북-스마트폰게임개발자그룹 에서 도움을 얻어 업데이트. 하나용님에게 감사드립니다.


서버검증할거라면 클라이언트(앱)에서 publicKey는 필요가 없다. 

위험

구글의 샘플코드에서 publicKey를 사용하는 부분들을 사용하지 않도록 수정해야 하는데, 코드상에는 두 군데가 있다. 

int queryPurchases(Inventory inv, String itemType) throws JSONException, RemoteException 
{
    ....

    if (Security.verifyPurchase(mSignatureBase64, purchaseData, signature)) {
         logDebug("Sku is owned: " + sku);
         Purchase purchase = new Purchase(itemType, purchaseData, signature);

         // Record ownership and token
         inv.addPurchase(purchase);
    }
    else {
         logWarn("Purchase signature verification **FAILED**. Not adding item.");
         logDebug("   Purchase data: " + purchaseData);
         logDebug("   Signature: " + signature);
         verificationFailed = true;
    }
    ....

아래 검증하는 부분도 단순하게 skip 한다. 
public boolean handleActivityResult(int requestCode, int resultCode, Intent data) {
    ...

    Purchase purchase = null;
    try {
         purchase = new Purchase(mPurchasingItemType, purchaseData, dataSignature);
         String sku = purchase.getSku();

         // Verify signature
                
         // bisuit_jump
         /*
         if (!Security.verifyPurchase(mSignatureBase64, purchaseData, dataSignature)) {
             logError("Purchase signature verification FAILED for sku " + sku);
             result = new IabResult(IABHELPER_VERIFICATION_FAILED, "Signature verification failed for sku " + sku);
             if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, purchase);
             return true;
         }
         */
         logDebug("Purchase signature successfully verified.");
    ...

이렇게 하면, publicKey를 클라이언트에 두지 않으면서 영수증을 서버로 보내 전적으로 서버에 검증을 맡길 수 있다. 


댓글 없음:

댓글 쓰기