我想加密存储在Firestore数据库中的数据。假设您使用从用户密码派生的256位AES密钥对数据进行加密,并使用单个Google KMS密钥对AES密钥进行了加密。

这够了吗?还是我们需要在本地使用诸如RNCryptor之类的私有-公共密钥库?

就我而言,我所有的应用程序数据都存储在Firestore中,并具有支持的云功能(node.js)。需要加密大量用户数据。

每个用户在登录时都会以这种方式生成一个唯一的AES密钥。密钥将在首次登录或注册时生成,并且使用KMS密钥进行的AES密钥后期加密将保存在Firestore中。当需要解密时,将使用KMS密钥解密AES密钥,然后使用它。

String password  = "password";
int iterationCount = 1000;
int keyLength = 256;
int saltLength = keyLength / 8; // same size as key output

SecureRandom random = new SecureRandom();
byte[] salt = new byte[saltLength];
randomb.nextBytes(salt);
KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt,
                    iterationCount, keyLength);
SecretKeyFactory keyFactory = SecretKeyFactory
                    .getInstance("PBKDF2WithHmacSHA1");
byte[] keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
SecretKey key = new SecretKeySpec(keyBytes, "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] iv = new byte[cipher.getBlockSize());
random.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivParams);
byte[] ciphertext = cipher.doFinal(plaintext.getBytes("UTF-8"));


(代码参考:"Using Password-based Encryption on Android" article

仅有一件事,在我的用例中,没有最终用户端应用程序和服务提供商应用程序的概念。只有一个应用程序,firestore后端以及由node.js支持的服务器端云功能。我试图查看我是否可以生产出一个不受黑客攻击的强大系统来存储加密的内容(防止管理员也可以使用控制台仪表板查看该系统-以便获取私有数据)。我将确保无法直接访问Google KMS密钥,但是它将保存在另一个用户帐户中。

“ KMS密钥与Firebase数据库属于一个不同的Google帐户,因此没有一个用户(例如我)具有读取和解密数据的权限。黑客将需要破坏这两个帐户才能访问未加密的数据。”

策略参考HOW TO ENCRYPT A GOOGLE FIREBASE REALTIME DATABASE

最佳答案

您通常不必这样做,因为它是自动加密的。
https://cloud.google.com/firestore/docs/server-side-encryption
它已经没有裂缝了!

10-08 06:36
查看更多