我的一位客户开始面临登录问题。在初步分析之后,他使用的凭据似乎没有针对Android API 26+进行解密。他可以使用API低于26的iOS应用或Android设备登录,但代码无变化。现在我不确定Android在加密逻辑方面的变化。
这是我的应用程序堆栈:
iOS App:使用Xamarin构建(加密用户ID和密码以生成令牌)
Android App:原生Android开发平台(加密用户ID和密码以生成令牌)
API :使用.NET WCF构建(解密令牌以验证用户身份)
这是Android代码
import android.support.v7.app.AppCompatActivity;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import java.security.AlgorithmParameters;
public class Encryptor {
final static String base64Key = "**********";
final static String base64Iv = "*********";
public static String encrypt(final String message) throws Exception
{
byte[] b = message.getBytes("Unicode");
return new String(Base64.encodeBase64(Encryptor.transform(Cipher.ENCRYPT_MODE, b)));
}
private static byte[] transform(final int mode, final byte[] messageBytes) throws Exception
{
final SecretKeySpec keySpec = new SecretKeySpec(base64Key.getBytes("UTF-8"), "AES");
final IvParameterSpec ivSpec = new IvParameterSpec(base64Iv.getBytes("UTF-8"));
final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(mode, keySpec, ivSpec);
return cipher.doFinal(messageBytes);
}
public static String getKey() throws Exception{
return encrypt(Session.getUserProfile().userName + "," + Session.getUserProfile().password);
}
}
以下是用于解密的.NET代码
private const string AesIV = @"******";
private const string AesKey = @"*******";
public static string Decrypt(string text)
{
try
{
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.BlockSize = 128;
aes.KeySize = 128;
aes.IV = Encoding.UTF8.GetBytes(AesIV);
aes.Key = Encoding.UTF8.GetBytes(AesKey);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
// Convert Base64 strings to byte array
byte[] src = System.Convert.FromBase64String(text);
// decryption
using (ICryptoTransform decrypt = aes.CreateDecryptor())
{
byte[] dest = decrypt.TransformFinalBlock(src, 0, src.Length);
return Encoding.Unicode.GetString(dest);
}
}
catch (CustomException ex)
{
throw new CustomException(ErrorCodesRepository.EnumUserLoginErrors.UL_INVALID_USER.GetHashCode(), ErrorCodesRepository.GetErrorDescription(ErrorCodesRepository.EnumUserLoginErrors.UL_INVALID_USER.ToString()));
}
}
当我解密令牌时,我得到的值是栀搀愀愀愀愀栀愀愀<<碗。不确定我在做什么,以及为什么它在API 26+之后开始发生。相同的代码适用于较低的API版本。
任何帮助或指示都将不胜感激。