Java加密与硬编码密钥不同
我是加密新手 我查看了javax.crypto文档,并使用此代码对文件进行了加密Java加密与硬编码密钥不同,java,encryption,Java,Encryption,我是加密新手 我查看了javax.crypto文档,并使用此代码对文件进行了加密 File saveFile = new File("Settings.set"); saveFile.delete(); FileOutputStream fout = new FileOutputStream(saveFile); //Encrypt the settings //Generate a key byte key[]
File saveFile = new File("Settings.set");
saveFile.delete();
FileOutputStream fout = new FileOutputStream(saveFile);
//Encrypt the settings
//Generate a key
byte key[] = "My Encryption Key98".getBytes();
DESKeySpec desKeySpec = new DESKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey skey = keyFactory.generateSecret(desKeySpec);
//Prepare the encrypter
Cipher ecipher = Cipher.getInstance("DES");
ecipher.init(Cipher.ENCRYPT_MODE, skey);
// Seal (encrypt) the object
SealedObject so = new SealedObject(this, ecipher);
ObjectOutputStream o = new ObjectOutputStream(fout);
o.writeObject(so);
o.close();
然而,如果你是一个聪明的黑客(或者可能是我发现这一点后的业余爱好者),你所要做的就是打开包含这段代码的类文件,并且加密密钥(我的加密密钥98)清晰可见
如何加密加密密钥。。。英雄联盟你能吗
谢谢你的帮助 如果攻击者可以访问软件和文件,则可以对其进行解密。有一些方法可以解决这个问题:
- 使用不对称键。使用公钥加密文件,并且只能使用私钥对其进行解密。这假设软件不需要解密文件
- 使用Diffie-Hellman交换。如果要通过网络发送加密数据,双方都可以在攻击者不知道的情况下建立密钥
如果程序同时需要加密和解密数据,那么您将无能为力。攻击者只需运行程序并查看解密的信息。我认为,如果用户不输入加密和解密密钥,这是不可能的
如果没有完整的源代码,您可以使用一些技术使查看密钥变得更加困难,但这是不安全的。如果您的程序可以自己加密/解密文件,那么您需要执行解密的所有内容都已内置到程序中,因此确定的麻烦制造者可以解密您加密的文件
如果可能的话,向用户索要“密码”,并使用他们提供的密码作为加密/解密密钥。用户不能看到自己的加密密钥是否重要?或者仅仅重要的是,通过发现他赢得的密钥,用户不应该因此知道其他人的密钥
您可以提示用户输入个人密钥,并将其存储在外部,或在每次需要时提示用户。这样,每个用户的密钥都是他自己的,不可用于解密其他用户在其他计算机上存储的文档。攻击者总是可以执行程序可以执行的所有操作,通常还可以执行更多操作。确保安全的唯一方法是使用不受程序控制的信息。请求用户输入密码或将信息放入操作系统控制下的存储中。如果攻击者具有物理访问权限,或者甚至可能拥有大量权限,则后者将毫无帮助,除非涉及诸如受信任的平台模块(TPM)之类的特殊硬件。如果程序能够在没有用户额外输入的情况下解密数据,那么如果其他人有权访问该程序,您就无法真正避免其他人访问该文件 如果您仅针对Windows,您可能需要查看。它基本上做了相同的事情,但用于加密的密码短语受用户(或机器)作用域上的操作系统保护。简单地说:您需要用户登录(或在给定用户帐户上运行的程序)来访问密钥(或者对于机器范围,需要机器上任何用户的登录)
我不知道如何从Java访问API,但Google提供了一些包装器库。不要硬编码密钥。假设您手头没有用户输入密码短语,请将代码配置为从普通文件中提取加密密钥,然后依靠操作系统安全性确保文件安全。提供一种在系统管理员认为必要时迁移到新密钥的方法。最安全的方法是不使用任何加密,只需将user.properties放入主目录,并使用以下代码:
String userhome = System.getProperty("user.home");
String username = system.getProperty("user.name");
String hostname = java.net.InetAddress.getLocalHost().getHostName();
if (hostname.equals("webserver") && username.equals("root")){
ResourceBundle user = ResourceBundle.getBundle(userhome/ "user.properties");
}
作为旁注,您可能希望重新设计
Cipher.getInstance(“DES”)
方法调用: