KeyPairGenerator - 不同设备上的密钥对相同?

时间:2018-02-19 16:55:54

标签: android cryptography

专家,

是否可以使用Android KeyPairGenerator类在不同的设备上生成相同的密钥对?例如,通过覆盖SecureRandom类来生成相同的共享密钥。

非常感谢任何指导。

1 个答案:

答案 0 :(得分:2)

是的,有可能。您可以自己实际实现SecureRandom,因为它有一个公共构造函数。如果你应该这样做是另一回事。密钥生成器很可能在版本之间发生变化,这意味着您可以重新创建错误的密钥。此外 - 根据生成算法 - 生成可能需要很长时间。 RSA密钥生成都有多种生成密钥对的方式非常慢。

一般来说,你需要播种 RNG并保持种子秘密。这意味着您的值需要与密钥相同的安全性。在这种情况下,您也可以使用该密钥来加密(或换行)私钥并使用它来分发密钥。如果使用椭圆曲线键之类的东西,则EC键只是所需种子大小的两倍(如果不对域参数进行编码,而只对秘密值进行编码)。因此,存储私钥不会占用那么多字节。

如果您想使用种子生成密钥对,那么最好使用明确定义的密钥派生函数,例如HKDF。请注意,EC私钥相对容易生成,因此您可能希望使用一组预设的域参数(例如P-256)来定位该特定算法。基本上,您必须自己进行密钥对生成 - 例如通过复制密钥对生成代码 - 以确保算法不会发生变化。

简单地播种现有的随机数生成器是一个非常糟糕的主意。现在不仅密钥对生成器可能会改变,而且随机数生成器也可能改变。它实际上已经在Android上已经改变,有几次。播种它可能仍然会导致不同的字节,因为它可能会使用真正的随机字节加上到你喂它的种子;这发生了。

如果您不想存储任何内容并使用密码,请使用Elliptic Curves,使用PBKDF2导出私钥,其中散列的大小与椭圆曲线相同。如果您可以存储某些内容,请使用基于密码的密钥派生函数(如PBKDF2)并加密私钥,可能使用PKCS#12密钥库或PGP。