我想加密我存储在Firestore数据库中的数据。我们假设您使用从用户密码派生的256位AES密钥加密数据,并使用单个Google KMS密钥加密AES密钥。
这够了吗?或者我们是否需要在本地使用一些像RNCryptor这样的私有公共cyptorgraphic库。
在我的情况下,我的所有应用数据都存储在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帐户,因此没有任何一个用户(例如我)有权同时读取数据并对其进行解密。黑客需要妥协这两个帐户才能访问未加密的数据。"
答案 0 :(得分:0)
您不必一般这样做,因为它是自动加密的
https://cloud.google.com/firestore/docs/server-side-encryption
它已经没有裂缝!
答案 1 :(得分:0)
我从Google Firebase支持团队得到的官方回复:
当前,自定义访问Firebase(例如访问Firestore,RTDB) 尚不支持,但强烈要求该功能。另外,你也可以 众所周知,Firestore客户端SDK不具有加密功能。所以 完成额外的加密不会有任何伤害(我不能建议太多 这部分)。此外,必须具有严格的安全规则。