Java 安卓加密

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3150830/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 16:53:22  来源:igfitidea点击:

Android encryption

javaandroidsecuritycryptography

提问by Se?or Reginold Francis

I am working on an android application, and I need to use encryption for one aspect of it. I am really indifferent to which algorithm I use (AES, DES, RSA, etc...). I am aware that Java has a crypto package, but I am not familiar with it at all. Can someone post an example on how to do an encrypt/decrypt function?

我正在开发一个 android 应用程序,我需要对它的一个方面使用加密。我真的对我使用的算法(AES、DES、RSA 等...)漠不关心。我知道 Java 有一个加密包,但我根本不熟悉它。有人可以发布有关如何执行加密/解密功能的示例吗?

采纳答案by Ethan Heilman

The java AESlibrary has a flaw in it that allows, under the right circumstances, a listener to decrypt the packets sent. See Padding Oracle Exploit Tool vs Apache MyFaces.

java AES库存在一个缺陷,在适当的情况下,它允许侦听器解密发送的数据包。请参阅填充 Oracle 漏洞利用工具与 Apache MyFaces

That being said check out this SO question Java 256bit AES Encryption.

话虽如此,请查看这个 SO 问题Java 256bit AES Encryption

Bouncy Castle AES EXAMPLE stolen from: http://www.java2s.com/Code/Java/Security/EncryptionanddecryptionwithAESECBPKCS7Padding.htm

Bouncy Castle AES 示例来自:http: //www.java2s.com/Code/Java/Security/EncryptionanddecryptionwithAESECBPKCS7Padding.htm

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class MainClass {
  public static void main(String[] args) throws Exception {
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());    
    byte[] input = "www.java2s.com".getBytes();
    byte[] keyBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 
                 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 
                 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 
                 0x15, 0x16, 0x17 };

    SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");

    System.out.println(new String(input));

    // encryption pass
    cipher.init(Cipher.ENCRYPT_MODE, key);

    byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
    int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
    ctLength += cipher.doFinal(cipherText, ctLength);
    System.out.println(new String(cipherText));
    System.out.println(ctLength);

    // decryption pass
    cipher.init(Cipher.DECRYPT_MODE, key);
    byte[] plainText = new byte[cipher.getOutputSize(ctLength)];
    int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);
    ptLength += cipher.doFinal(plainText, ptLength);
    System.out.println(new String(plainText));
    System.out.println(ptLength);
  }
}

回答by Plo_Koon

Look at my answer here Android database encryption. It contains 2 files that you can include in any of your applications that require data storage to be encrypted.

在这里查看我的回答Android 数据库加密。它包含 2 个文件,您可以将它们包含在需要加密数据存储的任何应用程序中。

回答by user868459

I would also check out Conceal to see if it fits your bill. It has a easy to use API which abstracts the cryptographic details: https://github.com/facebook/conceal/

我还会检查隐藏,看看它是否符合您的要求。它有一个易于使用的 API 来抽象加密细节:https: //github.com/facebook/conceal/

回答by Tin Megali

Considering the overhead to encrypt and decrypt data in Android, I devised a library that relies only in Android and Java native libraries to make the process as simple as possible.

考虑到在 Android 中加密和解密数据的开销,我设计了一个仅依赖于 Android 和 Java 本地库的库,以使该过程尽可能简单。

To install, use the jcenter distribuition center. On gradle:

要安装,请使用 jcenter 分发中心。在gradle上:

compile 'com.tinmegali.android:mcipher:0.4'

compile 'com.tinmegali.android:mcipher:0.4'

Usage

用法

String ALIAS = "alias"
MEncryptor encryptor = new MEncryptorBuilder( ALIAS ).build();
MDecryptor decryptor = new MDecryptorBuilder( ALIAS ).build();

String toEncrypt = "encrypt this string";
// encrypting
String encrypted = encryptor.encryptString( toEncrypt, this );

// decrypting
String decrypted = decryptor.decryptString( encrypted, this );

MCipher is compatible from SDK 19+, and it automatically adapts itself to smaller and large chunks of data. By default, it uses AES/GCM/NoPaddingfor SDKs 23+, and RSA/ECB/PKCS1Paddingfor older versions.

Mcipher 与 SDK 19+ 兼容,它会自动适应更小和大的数据块。默认情况下,它AES/GCM/NoPadding用于 SDK 23+ 和RSA/ECB/PKCS1Padding旧版本。

MCipher on Github

Github上的MCipher