Java加密与硬编码密钥不同

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[]

我是加密新手

我查看了javax.crypto文档,并使用此代码对文件进行了加密

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”)
方法调用: