内存加密和内存零未知-帮助我理解
Memory encryption and memory zero unknowns- assist my understanding
我想尽可能地保护我的用户数据!在这种情况下,我试图保护 data-in-use/data-in-memory 免受某些内存攻击,或者至少让不法分子更难获取我的用户数据。
我真的不明白 Flutter 和 Dart 如何处理内存或与此相关的任何语言。因此,我正在寻找一些关于我在这里尝试做的事情的见解、方向或确认,而不需要计算机科学硕士学位。当我使用 Flutter/Dart 时,这也是一个普遍的问题。
我的作案手法很简单,处理完一些敏感数据后我想:
- 为内存零加密数据
- 将所有加密内存归零
这符合我的意图吗?
如果这不符合我的意图或毫无意义,请解释原因。
/*
- Symmetric encryption
- Encryption before putting data into transit
- This symmetric key and nonce are asymmetrically encrypted with authorized users public keys
- Authorized users can decrypt the key
- Sensitive data is encrypted then zeroed
*/
Future<String> symmetricallyEncrypt(Sale sale) async {
String saleJson = jsonEncode(sale);
final symmetricKey = await secureStorage.read(key: kSSKeySymmetric);
final symmetricNonce = await secureStorage.read(key: kSSKeySymmetricNonce);
final symmetricCypher = AesCrypt(padding: PaddingAES.pkcs7, key: symmetricKey!);
final encryptedSale = symmetricCypher.gcm.encrypt(inp: saleJson, iv: symmetricNonce!);
/* --- ENCRYPTED ZERO --- */
encryptedZero(saleJson);
encryptedZero(symmetricKey);
encryptedZero(symmetricNonce);
encryptedZero(symmetricCypher.toString());
return encryptedSale;
}
/*
Encryption zero method
- Encrypts shredding input
- Zeros all inputs
*/
Future<void> encryptedZero(String shredding) async {
String? asymmetricPublicZeroKey = await secureStorage.read(key: kSSKeyMemoryZeroAsymmetricPublic);
String encryptedShredding = RSAPublicKey.fromPEM(asymmetricPublicZeroKey!).encrypt(shredding);
asymmetricPublicZeroKey = '';
encryptedShredding = '';
shredding = '';
}
我明白你的问题,但我认为这不是考虑内存安全的正确方法。
什么是威胁演员 - 另一个进程?操作系统?根用户?
如果您不信任 root 用户、OS 和硬件,您就已经输了。
如果你必须信任他们,那么你的威胁演员还有什么?您必须信任您的应用程序。所以唯一的其他事情是同一系统上的其他应用程序 运行。
操作系统阻止其他应用程序读取您的内存space(SEG FAULT 等)。 OS 在将应用程序的内存页面传递给另一个进程之前将其清零。
但这还不是全部 - 阅读 https://security.stackexchange.com/questions/29019/are-passwords-stored-in-memory-safe 了解更多详情。
我想尽可能地保护我的用户数据!在这种情况下,我试图保护 data-in-use/data-in-memory 免受某些内存攻击,或者至少让不法分子更难获取我的用户数据。
我真的不明白 Flutter 和 Dart 如何处理内存或与此相关的任何语言。因此,我正在寻找一些关于我在这里尝试做的事情的见解、方向或确认,而不需要计算机科学硕士学位。当我使用 Flutter/Dart 时,这也是一个普遍的问题。
我的作案手法很简单,处理完一些敏感数据后我想:
- 为内存零加密数据
- 将所有加密内存归零
这符合我的意图吗?
如果这不符合我的意图或毫无意义,请解释原因。
/*
- Symmetric encryption
- Encryption before putting data into transit
- This symmetric key and nonce are asymmetrically encrypted with authorized users public keys
- Authorized users can decrypt the key
- Sensitive data is encrypted then zeroed
*/
Future<String> symmetricallyEncrypt(Sale sale) async {
String saleJson = jsonEncode(sale);
final symmetricKey = await secureStorage.read(key: kSSKeySymmetric);
final symmetricNonce = await secureStorage.read(key: kSSKeySymmetricNonce);
final symmetricCypher = AesCrypt(padding: PaddingAES.pkcs7, key: symmetricKey!);
final encryptedSale = symmetricCypher.gcm.encrypt(inp: saleJson, iv: symmetricNonce!);
/* --- ENCRYPTED ZERO --- */
encryptedZero(saleJson);
encryptedZero(symmetricKey);
encryptedZero(symmetricNonce);
encryptedZero(symmetricCypher.toString());
return encryptedSale;
}
/*
Encryption zero method
- Encrypts shredding input
- Zeros all inputs
*/
Future<void> encryptedZero(String shredding) async {
String? asymmetricPublicZeroKey = await secureStorage.read(key: kSSKeyMemoryZeroAsymmetricPublic);
String encryptedShredding = RSAPublicKey.fromPEM(asymmetricPublicZeroKey!).encrypt(shredding);
asymmetricPublicZeroKey = '';
encryptedShredding = '';
shredding = '';
}
我明白你的问题,但我认为这不是考虑内存安全的正确方法。
什么是威胁演员 - 另一个进程?操作系统?根用户?
如果您不信任 root 用户、OS 和硬件,您就已经输了。
如果你必须信任他们,那么你的威胁演员还有什么?您必须信任您的应用程序。所以唯一的其他事情是同一系统上的其他应用程序 运行。
操作系统阻止其他应用程序读取您的内存space(SEG FAULT 等)。 OS 在将应用程序的内存页面传递给另一个进程之前将其清零。
但这还不是全部 - 阅读 https://security.stackexchange.com/questions/29019/are-passwords-stored-in-memory-safe 了解更多详情。