隐藏主键的Java加密性能

标签 java security google-app-engine encryption

我需要从最终用户输出中隐藏某些原始值(主要是主键,每个请求可能大约有 100 个),这样数据库就不容易被探测或迭代。加密速度比值的实际不可渗透性更重要。

我目前在以下包装器中使用 PBEWithMD5AndDES - 这是不是太过分了?我不熟悉使用 Java 作为 Web 后端。

public class SecurityHelper {
    private static final String DEFAULT_KEY = "some-key-here";
    private SecretKey secretKey;
    private PBEParameterSpec parameterSpec;
    private Cipher cipher;

    public SecurityHelper() {
        try {
            char[] moduleKeyChars = DEFAULT_KEY.toCharArray();
            KeySpec keySpec = new PBEKeySpec(moduleKeyChars);
            secretKey = SecretKeyFactory.getInstance(
              "PBEWithMD5AndDES").generateSecret(keySpec);
            parameterSpec = new PBEParameterSpec(new byte[8], 1);
            cipher = Cipher.getInstance("PBEWithMD5AndDES");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String encrypt(String secret) {
        String encrypted = null;
        try {
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec);
            byte[] stateBytes = cipher.doFinal(secret.getBytes("UTF-8"));
            encrypted = DatatypeConverter.printBase64Binary(stateBytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return encrypted;
    }

    public String decrypt(String encrypted) {
        String decrypted = null;
        try {
            cipher.init(Cipher.DECRYPT_MODE, secretKey, parameterSpec);
            byte[] stringBinary = DatatypeConverter.parseBase64Binary(encrypted);
            decrypted = new String(cipher.doFinal(stringBinary));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return decrypted;
    }

}

或者我使用像 XOR cipher 这样的东西会更好吗? ?

最佳答案

如果您确实想对用户隐藏这些值,我不明白您为什么要对它们进行加密或散列处理。您应该做的是生成随机且唯一的 key 。您是否考虑过使用 GUID?

如果您认为 GUID 太长,您可以生成一个预定义长度的随机字符串。使您的数据库列成为唯一索引,以便加快搜索速度。

这就是 bit.ly 或 goo.gl 等 URL 缩短器的工作原理。这将防止任何人使用主键在您的数据库中爬行。

关于隐藏主键的Java加密性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29714229/

相关文章:

java - 获取Android中的屏幕高度

java - 如何在不覆盖预先保存的数据的情况下向文件中写入更多内容

javascript - 使用ajax get方法加载网站信息是否安全?

security - 如何限制特定主机对 Cassandra 的访问?

laravel - 关于 Laravel 5.1 安全性

spring-boot - Spring Boot 应用程序在 App Engine Flexible 上不断重启

java - java游戏编程中求圆角矩形的中心

swift - 我如何将完美(快速)后端代码 + PostgreSQL 部署到 Google App Engine

java - Google 应用引擎 JDO 延迟数据持久性

java - Akka Actor 意外地清理了它的状态