【问题标题】:KeyPairGenerator - same key pair on different devices?KeyPairGenerator - 不同设备上的相同密钥对?
【发布时间】:2018-07-29 22:58:46
【问题描述】:

专家,

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

非常感谢任何指导。

【问题讨论】:

  • 这不会违背SecureRandom的目的吗?
  • 没有。您可以做的是通过密钥协商协议的带外通信就密钥达成一致,然后直接或在 PRNG 中使用该密钥。

标签: android cryptography


【解决方案1】:

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

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

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

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


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

【讨论】:

    猜你喜欢
    • 2014-08-12
    • 2017-09-25
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多