我正在编写此代码来恢复用户保存的Chrome密码并将其显示在控制台上。 我能够解码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)
答案 0 :(得分:0)
decoder.decode()
返回二进制数据。您无法根据二进制数据创建String
。
如果您要使用byte[]
返回的byte[]
的前5个字节的decoder.decode()
,请使用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));
答案 1 :(得分:0)
@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);
它有效,但是现在我必须了解其密钥格式:) 谢谢,安德里亚斯