Java加密替代硬编码密钥

时间:2010-07-06 16:25:47

标签: 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[] = "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();

然而,如果你是一个聪明的黑客(或者甚至可能是业余的,因为我发现了这一点),你所要做的就是打开包含这段代码的类文件,并且加密密钥(My Encryption Key98)清晰可见

如何加密加密密钥? ......哈哈......你能吗?

感谢您的帮助!

8 个答案:

答案 0 :(得分:6)

如果攻击者可以访问软件和文件,它可以解密它。有一些方法可以解决这个问题:

  • 使用不对称键。使用公钥加密文件,只能使用私钥解密。这假定软件不需要解密文件。
  • 使用Diffie-Hellman交换。如果您想通过网络发送加密数据,双方都可以在没有攻击者知道的情况下建立密钥。

如果程序需要加密和解密数据,那么您无能为力。攻击者可以简单地运行程序并查看解密的信息。

答案 1 :(得分:3)

攻击者可以随时执行程序可以执行的所有操作,通常可以执行更多操作。确保安全的唯一方法是使用不受程序控制的信息。请求用户在操作系统的控制下输入密码或将信息放入商店。如果攻击者具有物理访问权限,甚至可能拥有大量权利,除非涉及可信平台模块(TPM)等特殊硬件,否则后者无济于事。

答案 2 :(得分:1)

如果程序可以在没有用户额外输入的情况下解密数据,那么如果他有权访问该程序,则无法真正避免其他人访问该文件。

如果您仅定位Windows,则可能需要查看Data Protection API (DPAPI)。它基本上做同样的事情,但用于加密的密码短语受操作系统在用户(或机器)范围内的保护。简单地说:您需要用户登录(或在给定用户帐户上运行的程序)才能访问密钥(或者机器范围是计算机上任何用户的登录)。

我不知道如何从Java访问API,但Google会提供一些包装库。

答案 3 :(得分:1)

不要对密钥进行硬编码。假设您没有手头的用户输入密码,请配置您的代码以从普通文件中提取加密密钥,然后依靠操作系统安全性来保证文件的安全。提供一种在系统管理员认为必要时迁移到新密钥的方法。

答案 4 :(得分:0)

如果没有用户在加密和解密时输入密钥,我不相信这是可能的。

你可以使用一些技术,在没有完整源代码的情况下更难查看密钥,但它不安全。

答案 5 :(得分:0)

如果您的程序可以自己加密/解密文件,那么执行解密所需的所有内容都已内置到程序中,因此确定的麻烦制造者可以解密您加密的文件。

如果可能,请询问用户“密码”,并使用他们提供的加密/解密密钥。

答案 6 :(得分:0)

用户无法看到自己的加密密钥是否很重要?或者仅仅重要的是,通过发现他赢得的钥匙,用户不应该因此知道其他人的钥匙?

您可以提示用户输入个人密钥,并将其存储在外部或每次需要时提示用户。这样每个用户的密钥都是他自己的密钥,并且不能用于解密其他用户在其他机器上存储的文件。

答案 7 :(得分:0)

最安全的方法是不使用任何加密,只需将您的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");
}