Gradle AES 加密脚本
Gradle script for AES encryption
对于 Android 应用程序,我想在使用 gradle 构建时 obfuscate/encrypt 服务器 public 密钥。
现在我正在使用 Base64 进行混淆,但我需要额外的 AES
task encryptKeys {
doFirst {
//Encrypt the server key
// Load key
byte[] key = new File('project/keys/server.crt.der').bytes
// Encode key twice
String encoded = key.encodeBase64().toString();
encoded = encoded.bytes.encodeBase64().toString();
//TODO AES ENCRYPTION HERE
// Save key
new File('project/src/main/assets/server.crt.der').bytes = encoded.getBytes()
稍后在运行时使用此密钥时,我会像这样解密它
public static String decrypt(byte[] cipherText) throws Exception{
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(IV.getBytes("UTF-8")));
return new String(cipher.doFinal(cipherText),"UTF-8");
}
在 gradle 脚本中使用 AES 加密我的密钥的正确方法是什么? Google 帮不了我。这是完全可能的还是我需要找到其他解决方案?
在 java 中有类似的 SO question here 用于使用 AES 加密字符串。
我已将其采用到下面的 gradle 脚本中。
它将使用密钥 KEY
加密 SERVERKEY
字符串(在您的版本中从外部源加载)。我没有安装 BouncyCastle,所以我使用了 SunJCE,但我将它保留为参数,以便您可以轻松更改它。
这个简单案例的输出是文件 "obf.enc"。 decIt
任务也将解密并打印出来以表明它是对称工作的。
你最困难的部分显然是你的 KEY
用于加密的事实嵌入在你的应用程序中(因此我在评论中提出问题),所以这只是通过默默无闻的安全性,但如果这对应用程序来说足够好,就这样吧。
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec
import javax.crypto.Cipher
ext {
KEY = "mysecretkey".padRight(16).getBytes("UTF-8")
SERVERKEY = "serverkey"
IV = "1234".padRight(16).getBytes("UTF-8")
PROVIDER = "SunJCE"
}
task encIt << {
SecretKeySpec key = new SecretKeySpec(KEY, "AES")
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", PROVIDER)
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(IV))
def encBytes = cipher.doFinal(SERVERKEY.bytes)
def out = file('obf.enc')
out.delete()
out << encBytes
}
task decIt << {
def cipherText = file('obf.enc').bytes
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", PROVIDER)
SecretKeySpec key = new SecretKeySpec(KEY, "AES")
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(IV))
println new String(cipher.doFinal(cipherText), "UTF-8")
}
对于 Android 应用程序,我想在使用 gradle 构建时 obfuscate/encrypt 服务器 public 密钥。
现在我正在使用 Base64 进行混淆,但我需要额外的 AES
task encryptKeys {
doFirst {
//Encrypt the server key
// Load key
byte[] key = new File('project/keys/server.crt.der').bytes
// Encode key twice
String encoded = key.encodeBase64().toString();
encoded = encoded.bytes.encodeBase64().toString();
//TODO AES ENCRYPTION HERE
// Save key
new File('project/src/main/assets/server.crt.der').bytes = encoded.getBytes()
稍后在运行时使用此密钥时,我会像这样解密它
public static String decrypt(byte[] cipherText) throws Exception{
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(IV.getBytes("UTF-8")));
return new String(cipher.doFinal(cipherText),"UTF-8");
}
在 gradle 脚本中使用 AES 加密我的密钥的正确方法是什么? Google 帮不了我。这是完全可能的还是我需要找到其他解决方案?
在 java 中有类似的 SO question here 用于使用 AES 加密字符串。
我已将其采用到下面的 gradle 脚本中。
它将使用密钥 KEY
加密 SERVERKEY
字符串(在您的版本中从外部源加载)。我没有安装 BouncyCastle,所以我使用了 SunJCE,但我将它保留为参数,以便您可以轻松更改它。
这个简单案例的输出是文件 "obf.enc"。 decIt
任务也将解密并打印出来以表明它是对称工作的。
你最困难的部分显然是你的 KEY
用于加密的事实嵌入在你的应用程序中(因此我在评论中提出问题),所以这只是通过默默无闻的安全性,但如果这对应用程序来说足够好,就这样吧。
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec
import javax.crypto.Cipher
ext {
KEY = "mysecretkey".padRight(16).getBytes("UTF-8")
SERVERKEY = "serverkey"
IV = "1234".padRight(16).getBytes("UTF-8")
PROVIDER = "SunJCE"
}
task encIt << {
SecretKeySpec key = new SecretKeySpec(KEY, "AES")
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", PROVIDER)
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(IV))
def encBytes = cipher.doFinal(SERVERKEY.bytes)
def out = file('obf.enc')
out.delete()
out << encBytes
}
task decIt << {
def cipherText = file('obf.enc').bytes
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", PROVIDER)
SecretKeySpec key = new SecretKeySpec(KEY, "AES")
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(IV))
println new String(cipher.doFinal(cipherText), "UTF-8")
}