簡體   English   中英

Android中的Base64和mcrypt_encrypt

[英]Base64 and mcrypt_encrypt in android

我需要在Android中使用密鑰加密某些文本。 在PHP中,加密代碼如下所示

$this->securekey = hash('sha256',$textkey,TRUE);
$this->iv = mcrypt_create_iv(32, MCRYPT_DEV_URANDOM);
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->securekey, $input, MCRYPT_MODE_ECB, $this->iv));

對於Base64,我為我的Android應用程序在Netbeans中添加了來自apache.org(commons-codec-1.6.jar)的通用編解碼器。 代碼沒有錯誤。 但是,當我運行該應用程序並調用使用編解碼器的函數時,該應用程序停止並且需要先關閉。

在logCat中說:

Android Runtime: java.lang.NoSuchMethodError: 
org.apache.commons.codec.binary.Base64.decodeBase64

這是我的代碼:

public static String crypt(String input, String key){
            byte[] crypted = null;
            try{
                SecretKeySpec skey = new SecretKeySpec(org.apache.commons.codec.binary.Base64.decodeBase64(key), "AES");
                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
                cipher.init(Cipher.ENCRYPT_MODE, skey);
                crypted = cipher.doFinal(input.getBytes());
            }catch(Exception e){
            }
           return org.apache.commons.codec.binary.Base64.encodeBase64String(crypted);
        }

我不確定我的代碼是否與PHP代碼進行相同的加密。 我在Android和PHP之間找到了此鏈接http://www.androidsnippets.com/encrypt-decrypt-between-android-and-php ,但它不使用Base64,僅用於mcrypt_encrypt。 誰能幫助我獲得與PHP服務器相同的加密。

提前致謝。

您的錯誤僅是因為您忘記將Apache編解碼器庫添加到運行時環境。 僅僅針對它進行編譯是不夠的。 該庫需要實際存在於Android設備上。

您無法使用默認的Java庫在Android上獲得相同的加密,您可能需要Bouncy Castle庫。 您的示例中的PHP代碼使用Rijndael,其塊大小為32字節。 AES是Rijndael的子集,塊大小為16個字節。 這在PHP mcrypt中稱為MCRYPT_RIJNDAEL_128

其他一些實現細節:

  • ECB不使用IV(到目前為止,我已經用更好的方法代替了默認的mcrypt_encrypt示例)。
  • mcrypt_encrypt不執行PKCS5Padding,我認為它使用空格。
  • input.getBytes()是不可移植的,它使用平台默認編碼,該編碼可能與PHP編碼不同;

最后是一些安全警告:

  • 僅對密碼使用SHA-256被認為是不安全的,請使用PBKDF2;
  • ECB被認為不安全,請使用CBC;
  • MCRYPT_DEV_URANDOM是不安全的(這基本上意味着PHP加密是毫無價值的,最好使用PHP openssl包裝器);

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM