首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AES算法安全吗?

AES算法安全吗?
EN

Stack Overflow用户
提问于 2017-10-24 16:11:01
回答 1查看 80关注 0票数 1

下面是我在对我的android项目的AES进行了一些研究之后收集起来的一个算法,我想知道的是,它安全吗?它可以改进吗?我之所以问这个问题,是因为我看到了很多不同的方法,只是需要一点帮助。

谢谢,我真的很感谢你的帮助。

代码语言:javascript
复制
private static final int pswdIterations = 1000;
private static final int keySize = 256;
private static final int saltlength = keySize / 8;

private static final String ENCODING = "UTF-8";
private static final String PBK = "PBKDF2WithHmacSHA1";
private static final String AES = "AES";
private static final String CIPHER = "AES/CBC/PKCS5Padding";

public String encrypt(String plainText) throws Exception {
    //get text from password field
    final String pass = password.getText().toString();
    //get salt from generateSalt() method (see below)
    String salt = generateSalt();
    //convert salt to bytes
    byte[] saltBytes = salt.getBytes(ENCODING);

    // Derive the key from
    SecretKeyFactory factory = SecretKeyFactory.getInstance(PBK);
    PBEKeySpec spec = new PBEKeySpec(
            pass.toCharArray(),
            saltBytes,
            pswdIterations,
            keySize
    );

    //encode key
    SecretKey secretKey = factory.generateSecret(spec);
    SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(), AES);

    //encrypt the message
    Cipher cipher = Cipher.getInstance(CIPHER);
    cipher.init(Cipher.ENCRYPT_MODE, secret);
    AlgorithmParameters params = cipher.getParameters();
    byte[] ivBytes = params.getParameterSpec(IvParameterSpec.class).getIV();
    byte[] encryptedTextBytes = cipher.doFinal(plainText.getBytes(ENCODING));

    //encode text and output final encrypted text
    String encodedText = Base64.encodeToString(encryptedTextBytes, Base64.DEFAULT);
    String encodedIV = Base64.encodeToString(ivBytes, Base64.DEFAULT);
    String encodedSalt = Base64.encodeToString(saltBytes, Base64.DEFAULT);
    return encodedSalt +  encodedText + encodedIV;
}

public static String generateSalt() {
    SecureRandom random = new SecureRandom();
    byte bytes[] = new byte[saltlength];
    random.nextBytes(bytes);
    return new String(bytes);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-24 19:57:36

基本上,该方案看起来是安全的,但不包括身份验证。

改进:

  1. 在合并的结果中包括迭代计数。
  2. 包含一个版本指示符,可以简单到一个字节。
  3. 通常,字节数组被连接,然后使用一个整体的Base64编码。

备注:

考虑使用RNCryptor

看看RNCryptor-Spec,看看如何将不同的项目打包在一起。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46915299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档