我编写这段代码是为了恢复用户保存的铬密码并将它们显示在控制台上。我能够解码Base64编码。但我没能从这个Crypt32Util.cryptUnprotectData那里得到任何帮助.我是个初学者。::Main.java
import java.io.FileReader;
import java.util.Base64;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import com.sun.jna.platform.win32.Crypt32Util;
public class Main {
public static void main(String[] args) {
String name = System.getProperty("user.home");
name += "\\AppData\\Local\\Google\\Chrome\\User Data\\";
String masterKey = "";
String localState = name + "Local State";
try {
Object object = new JSONParser().parse(new FileReader(localState));
System.out.println("Success");
JSONObject jsonObject = (JSONObject) object;
JSONObject tempJsonObject = (JSONObject) jsonObject.get("os_crypt");
Base64.Decoder decoder = Base64.getDecoder();
String encryptedKey = (String) tempJsonObject.get("encrypted_key");
String decryptedKey = new String(decoder.decode(encryptedKey));
String encryptedMasterKey = decryptedKey.substring(5);
System.out.println(encryptedMasterKey);
masterKey = new String(Crypt32Util.cryptUnprotectData(encryptedMasterKey.getBytes()));
System.out.println(masterKey);
} catch (Exception e) {
e.printStackTrace();
}
}
}输出
Success
[value of **encryptedMasterKey**]
com.sun.jna.platform.win32.Win32Exception: The data is invalid.
at com.sun.jna.platform.win32.Crypt32Util.cryptUnprotectData(Crypt32Util.java:144)
at com.sun.jna.platform.win32.Crypt32Util.cryptUnprotectData(Crypt32Util.java:117)
at com.sun.jna.platform.win32.Crypt32Util.cryptUnprotectData(Crypt32Util.java:104)
at com.main.Main.main(Main.java:26)发布于 2020-10-05 19:30:59
decoder.decode()返回二进制数据。不能从二进制数据创建String。
如果您希望byte[]具有decoder.decode()返回的byte[]的前5个字节,请使用Arrays.copyOfRange()
String encryptedKey = (String) tempJsonObject.get("encrypted_key");
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedKey = decoder.decode(encryptedKey);
byte[] encryptedMasterKey = Arrays.copyOfRange(decodedKey, 0, 5);
byte[] masterKey = Crypt32Util.cryptUnprotectData(encryptedMasterKey);然而,我怀疑这是正确的。为什么你相信主密码只能被加密到5个字节,其余的是什么呢?
更有可能的是,所有字节都是主密钥的加密版本:
String encryptedKey = (String) tempJsonObject.get("encrypted_key");
byte[] masterKey = Crypt32Util.cryptUnprotectData(Base64.getDecoder().decode(encryptedKey));发布于 2020-10-06 05:56:16
@Andreas的答案几乎是正确的,我使用了以下代码,这给了我一个例外
String encryptedKey = (String) tempJsonObject.get("encrypted_key");
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedKey = decoder.decode(encryptedKey);
byte[] encryptedMasterKey = Arrays.copyOfRange(decodedKey, 0, 5);
byte[] masterKey = Crypt32Util.cryptUnprotectData(encryptedMasterKey);所以它只是改变了一些值
String encryptedKey = (String) tempJsonObject.get("encrypted_key");
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedKey = decoder.decode(encryptedKey);
byte[] encryptedMasterKey = Arrays.copyOfRange(decodedKey, 5, decodedKey.length);
byte[] masterKey = Crypt32Util.cryptUnprotectData(encryptedMasterKey);它成功了,但现在我必须理解它的关键格式:)谢谢,Andreas
https://stackoverflow.com/questions/64214514
复制相似问题