gpt4 book ai didi

Android,SharedPreferences 使用 AES-128 加密记住登录详细信息但不会解密

转载 作者:搜寻专家 更新时间:2023-11-01 08:47:19 31 4
gpt4 key购买 nike

我正在尝试做的事情:

在 Android 中,我尝试使用 SharedPreferences 在应用程序内存中存储用户名。所以用户不需要每次都输入用户名,但应用程序不会解密用户名。在没有加密的情况下,它会存储和返回用户名,但使用 AES-128 加密后,用户名不会被解密/返回。

发生了什么:

程序将新加密的用户名存储在内存中,但是当应用程序尝试解密它们时,什么也没有发生(用户名文本框返回为空)。

应用程序打算做什么:(但没有做)

用户应输入他们的用户名和密码,如果他们单击“记住”复选框,则在按下登录按钮后,应用程序会存储并加密他们的用户名。

在以后运行该应用程序时,如果该复选框先前已选中,则其用户名将显示在用户名文本框中。当按钮功能完成时,应用程序将由“doSomethinghElse”子例程重新启动,以便向我确认该应用程序已运行并且已返回未加密的用户名。(但现在还没有发生)

实际问题:

它不是解密和返回用户名。删除加密、尝试和捕获后,应用程序会返回先前用户的登录详细信息。但在添加加密后,该应用不会返回用户名。

为了帮助人们解决这个问题,以下内容主要基于以下 2 个链接:

Add a "Remember me" checkbox

http://www.androidsnippets.com/encryptdecrypt-strings

代码:

加密.java

public class Crypto {
public static String encrypt(String seed, String cleartext)
throws Exception {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] result = encrypt(rawKey, cleartext.getBytes());
return toHex(result);
}

public static String decrypt(String seed, String encrypted)
throws Exception {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] enc = toByte(encrypted);
byte[] result = decrypt(rawKey, enc);
return new String(result);
}

private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(seed);
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}

private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
}

private static byte[] decrypt(byte[] raw, byte[] encrypted)
throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
}

public static String toHex(String txt) {
return toHex(txt.getBytes());
}

public static String fromHex(String hex) {
return new String(toByte(hex));
}

public static byte[] toByte(String hexString) {
int len = hexString.length() / 2;
byte[] result = new byte[len];
for (int i = 0; i < len; i++)
result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),
16).byteValue();
return result;
}

public static String toHex(byte[] buf) {
if (buf == null)
return "";
StringBuffer result = new StringBuffer(2 * buf.length);
for (int i = 0; i < buf.length; i++) {
appendHex(result, buf[i]);
}
return result.toString();
}

private final static String HEX = "0123456789ABCDEF";

private static void appendHex(StringBuffer sb, byte b) {
sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
}
}

最佳答案

编码:

     public String encryptString(String dataToEncrypt) {

try {
SharedPreferences prefs = context.getSharedPreferences("appname", 0);
if (prefs.getString("SECRET_KEY","") == "") {
secretKeySpec = GenerateSecretKeySpecs();
String stringSecretKey = Base64.encodeToString(
secretKeySpec.getEncoded(), Base64.DEFAULT);

SharedPreferences.Editor editor = prefs.edit();
editor.putString("SECRET_KEY", stringSecretKey);
editor.commit();

}
if (prefs.getString("SECRET_KEY","") != "") {
byte[] encodedBytes = null;

Cipher c = Cipher.getInstance("AES");
String key =prefs.getString("SECRET_KEY","");

byte[] encodedKey = Base64.decode(key, Base64.DEFAULT);
SecretKey originalKey = new SecretKeySpec(encodedKey, 0,
encodedKey.length, "AES");
c.init(Cipher.ENCRYPT_MODE, originalKey);
encodedBytes = c.doFinal(dataToEncrypt.getBytes());

return Base64.encodeToString(encodedBytes, Base64.DEFAULT);
} else {
return null;
}
} catch (Exception e) {
// Log.e(TAG, "AES encryption error");
return null;
}
}

解码:

public String decryptString(String dataToDecrypt) {
SharedPreferences prefs= context.getSharedPreferences("appname", 0);
if (prefs.getString("SECRET_KEY","") != "") {
byte[] decodedBytes = null;
try {
Cipher c = Cipher.getInstance("AES");

String key = prefs.getString("SECRET_KEY","")
byte[] encodedKey = Base64.decode(key, Base64.DEFAULT);
SecretKey originalKey = new SecretKeySpec(encodedKey, 0,
encodedKey.length, "AES");
c.init(Cipher.DECRYPT_MODE, originalKey);

byte[] dataInBytes = Base64.decode(dataToDecrypt,
Base64.DEFAULT);

decodedBytes = c.doFinal(dataInBytes);
return new String(decodedBytes);
} catch (Exception e) {
// Log.e(TAG, "AES decryption error");
e.printStackTrace();
return null;
}

} else
return null;

}

例子:

String encrypted_password = encryptString(MPwd);
String decrypted_password = decryptString(encrypted_password);

我已经使用了这段代码,它工作正常..

希望对你有所帮助。

关于Android,SharedPreferences 使用 AES-128 加密记住登录详细信息但不会解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26908591/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com