android - 加密您的 Firestore 数据

标签 android encryption google-cloud-firestore

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

这够了吗?或者我们是否需要在本地使用某种私有(private)-公共(public)加密库,例如 RNCryptor。

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

每个用户在登录时都会有一个通过以下方式生成的唯一 AES key 。该 key 将在首次登录或注册时生成,并且使用 KMS key 进行加密后的 AES key 将保存在 Firestore 本身中。当需要解密时,将使用KMS key 来解密AES key ,然后使用它。

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 提供支持的服务器端云功能。我想看看是否可以创建一个不受黑客攻击的强大系统,以存储加密的内容(防止管理员也使用控制台仪表板查看相同的内容 - 用于私有(private)数据)。我将确保无法直接访问 Google KMS key ,但它将保存在另一个用户帐户中。

“KMS key 属于与 Firebase 数据库不同的 Google 帐户,因此任何用户(例如我)都没有权限读取数据并解密数据。黑客需要入侵这两个帐户才能访问未加密的数据”

策略引用HOW TO ENCRYPT A GOOGLE FIREBASE REALTIME DATABASE

最佳答案

我从 Google Firebase 支持团队得到的官方回复:

Currently, custom access to Firebase (e.g. access to Firestore, RTDB) is not yet supported, but a highly requested feature. Also, as you may know, Firestore client SDKs do not have encrypting capabilities. So additional encryption done won’t hurt (I cannot suggest that much on this part). To add, having a strict security rules is a must.

关于android - 加密您的 Firestore 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50795427/

相关文章:

java - 将数组读/写到 firebase 的最佳/更好方法

java - 在 Java Android 中加密并在 C# Unity 中解密

ruby-on-rails - 在 Ruby on Rails 中验证 Django 密码给出不匹配的密码

javascript - 未捕获的类型错误 : Cannot set property 'innerHTML' of null

android - 如何在水平 ScrollView 中获取滚动状态 : Android

encryption - System.Data.SQLite 使用什么类型/级别的密码加密

firebase - firestore.FieldValue.serverTimestamp() 是异步的吗?

android - 无效的文档引用。文档引用必须有偶数个段,但 mylist 有 1

android - 使用带有可检查选项菜单项和 state_checked 的 ColorStateList

java - 捕获当前Webview并保存到SD卡