密钥库公钥/私钥
Posted
技术标签:
【中文标题】密钥库公钥/私钥【英文标题】:Keystore public/private key 【发布时间】:2022-01-15 21:06:37 【问题描述】:我目前正忙于 androidkeystore 公钥/私钥加密。我正在捕获用户数据,在将其上传到 firebase 之前,我想对其进行加密。我在https://dzone.com/articles/xamarin-android-asymmetric-encryption-without-any这个链接的帮助下做到了。
我在设备上捕获了用户登录凭据和用户数据,并在将数据上传到 Firebase 之前使用公钥对数据进行了加密。然后我从 firebase 检索数据并使用私钥成功解密数据。现在,当我在其他设备上登录时,我无法解密数据。这可能是因为我没有以前设备的密钥对吗?
您很可能会注意到,我对这个主题知之甚少。有什么可能的方法可以实现上述问题。
下面是我使用的代码:初始化 KeyStore
public PlatformEncryptionKeyHelper(Context context, string keyName)
_context = context;
_keyName = keyName.ToLowerInvariant();
_androidKeyStore = KeyStore.GetInstance(KEYSTORE_NAME);
_androidKeyStore.Load(null);
生成密钥对
var builder = new KeyGenParameterSpec.Builder(_keyName, KeyStorePurpose.Encrypt | KeyStorePurpose.Decrypt)
.SetBlockModes(KeyProperties.BlockModeEcb)
.SetEncryptionPaddings(KeyProperties.EncryptionPaddingRsaPkcs1)
.SetRandomizedEncryptionRequired(false).SetKeySize(KeySize);
keyGenerator.Initialize(builder.Build());
keyGenerator.GenerateKeyPair();
获取公钥
public IKey GetPublicKey()
if (!_androidKeyStore.ContainsAlias(_keyName))
return null;
return _androidKeyStore.GetCertificate(_keyName)?.PublicKey;
获取私钥
public IKey GetPrivateKey()
if (!_androidKeyStore.ContainsAlias(_keyName))
return null;
return _androidKeyStore.GetKey(_keyName, null);
用法
_encryptionKeyHelper = new PlatformEncryptionKeyHelper(Application.Context, KeyStoreName);
_encryptionKeyHelper.CreateKeyPair();
_privateKey = _encryptionKeyHelper.GetPrivateKey();
_publicKey = _encryptionKeyHelper.GetPublicKey();
提前致谢!
【问题讨论】:
【参考方案1】:现在,当我在其他设备上登录时,我无法解密数据
根据代码,您似乎为每个设备生成了一个新的密钥对。您如何想象使用不同密钥解密任何数据?您需要在每个用户的设备上拥有相同的私钥或解密密钥才能共享加密数据。
在非对称加密中,您使用接收者的公钥进行加密,因此理论上您可以在其他用户的设备之间共享公钥,并且用户可以为不同的设备进行加密。但如果没有更多细节和用例,它可能可行,也可能不可行。
我捕获了用户登录凭据和用户数据
捕获/保留用户凭据通常是一个非常糟糕的主意。即使加密也不要存储用户凭据。迟早会爆发的,尤其是在承认我对这个话题知之甚少时(这是一个很好的步骤)
【讨论】:
以上是关于密钥库公钥/私钥的主要内容,如果未能解决你的问题,请参考以下文章