首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓中的密码encrytion.decryption

安卓中的密码encrytion.decryption
EN

Stack Overflow用户
提问于 2014-03-15 10:46:17
回答 2查看 3K关注 0票数 1
代码语言:javascript
复制
String text = name1.getText().toString();
    // Sending side
    byte[] data = null;
    try {
        data = text.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e1) {
    e1.printStackTrace();
    }
    String base64 = Base64.encodeToString(data, Base64.DEFAULT);

我能够加密密码和将解密相同的密码,但我在脑海中有一些东西,我不确定这是我第一次尝试加密密码。这样加密密码安全吗?因为我尝试加密一个密码:zxc,结果只是一个四个字母的密码(结果是:enhj),所以我想知道加密密码是否安全。有没有关于如何重新编写代码以使其更安全且不易解码的想法,以及如何解密加密密码的想法?

更新:这是我在this site here找到的加密和解密示例,但我无法使其运行。

加密

代码语言:javascript
复制
String password  = "password";
int iterationCount = 1000;
int keyLength = 256;
int saltLength = keyLength / 8; // same size as key output

SecureRandom random = new SecureRandom();
byte[] salt = new byte[saltLength];
randomb.nextBytes(salt);
KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt,
                    iterationCount, keyLength);
SecretKeyFactory keyFactory = SecretKeyFactory
                    .getInstance("PBKDF2WithHmacSHA1");
byte[] keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
SecretKey key = new SecretKeySpec(keyBytes, "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] iv = new byte[cipher.getBlockSize());
random.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivParams);
byte[] ciphertext = cipher.doFinal(plaintext.getBytes("UTF-8"));

解密

代码语言:javascript
复制
String[] fields = ciphertext.split("]");
byte[] salt = fromBase64(fields[0]);
byte[] iv = fromBase64(fields[1]);
byte[] cipherBytes = fromBase64(fields[2]);
// as above
SecretKey key = deriveKeyPbkdf2(salt, password);

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec ivParams = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, key, ivParams);
byte[] plaintext = cipher.doFinal(cipherBytes);
String plainrStr = new String(plaintext , "UTF-8");
EN

回答 2

Stack Overflow用户

发布于 2014-03-15 11:27:22

您已经标记了这个密码学、密码和加密,所以我将这样回答。

首先,Base64不是真正的加密,它只是编码--本质上是从8位字节变成6位字节,你的测试是完美的-- 3*8位字符= 24位。24位/6位=4个Base64字符。我还验证了enhj确实是my own C implementation of Base64上zxc的Base64编码。要进一步证明这一点,请注意您没有提供任何加密密钥!

其次,对于用户身份验证(我假设您正在做的事情),不要加密密码-这是一个主要的blunder Adobe just made。对于用户身份验证,您不需要再次查看用户的密码-您只需验证他们输入的内容是否与之前相同。因此,当他们第一次输入密码时,您需要对其进行加盐和散列处理。下一次,您将检索第一次使用的盐,并使用相同的盐(和迭代次数/工作因子)散列新输入的密码-如果结果与记录中的结果相同,请让它们进入,因为提供相同的密码将获得相同的结果。

How to securely hash passwords?的三个标准答案是PBKDF2、Bcrypt和Scrypt。关于Android密码散列的快速谷歌搜索结果如下:

新生成器= generator.init(PBEParametersGenerator.PKCS5PasswordToUTF8Bytes(password),SHA256Digest();PKCS5S2ParametersGenerator PKCS5S2ParametersGenerator,迭代);pbkdf2= (KeyParameter)generator.generateDerivedMacParameters(keySizeInBits);

  • The KeyParameter Android-developers blogspot article Using Cryptography to Store Credentials Safely也引用PBKDF2-HMAC-SHA-1。

public static SecretKey generateKey(char[] passphraseOrPin,byte[] salt)抛出NoSuchAlgorithmException,InvalidKeySpecException { //要使用的PBKDF2硬化轮数。值越大,//计算时间越长。您应该选择一个导致计算//花费>100ms的值。final int iterations = 8000;//生成160位密钥final int outputKeyLength = 160;secretKeyFactory SecretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");KeySpec keySpec = new PBEKeySpec(passphraseOrPin,salt,iterations,outputKeyLength);SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);return secretKey;

}

在所有情况下,选择尽可能高的迭代计数/工作因子,因为您可以忍受延迟(为您选择的算法使用尽可能快的库,因为您可以遵守的许可证)。您的salt应该是8到16字节长度范围内的加密随机字节序列。

特别是对于PBKDF2,千万不要使用超过本机散列大小的outputBytes,否则会给攻击者带来比较优势--SHA-1的本机大小是20字节,SHA-256是32字节,而SHA-512本机大小是64字节。

如果你真的需要加密而不是身份验证,上面的“使用加密技术安全地存储凭证”链接也涵盖了这一点,尽管更好的答案是存储盐和迭代次数/功因数,并简单地在每次从密码重新生成密钥-如果数据解密,这是很好的。如果不是,那就是错误的密码。

票数 7
EN

Stack Overflow用户

发布于 2014-03-15 11:27:56

你没有加密任何东西。您正在将字节转换为base64编码。请参阅http://examples.javacodegeeks.com/core-java/security/simple-symmetric-key-encrypt-decrypt/

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

https://stackoverflow.com/questions/22418901

复制
相关文章

相似问题

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