【问题标题】:Unique Key Pair Generation on AndroidAndroid 上的唯一密钥对生成
【发布时间】:2014-09-04 17:13:34
【问题描述】:

我一直在尝试在 android 中生成唯一的密钥对。谁能告诉我为什么第一次调用时总是产生相同的键?

long ltime = System.currentTimeMillis();
    SecureRandom random = null;
    random = new SecureRandom();
    byte[] seed = ByteBuffer.allocate(8).putLong(ltime).array();
    random.nextBytes(seed);
    RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(1024, RSAKeyGenParameterSpec.F4);
    try {
        mKeyPairGenerator.initialize(spec, random);
    } catch (InvalidAlgorithmParameterException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    mKeyPair = mKeyPairGenerator.generateKeyPair();
    mPublicKey = (PublicKey) mKeyPair.getPublic();
    mPrivateKey = (PrivateKey) mKeyPair.getPrivate();

【问题讨论】:

    标签: android security random


    【解决方案1】:

    始终生成相同的密钥,因为带有种子的SecureRandom 是确定性的,并且始终会产生相同的结果。只是不要设置种子,这可能是不安全的,您可以在参考书目中阅读:

    播种 SecureRandom 可能不安全

    种子是用于引导随机数的字节数组 一代。为了产生加密安全的随机数,两者 种子和算法必须是安全的。

    默认情况下,这个类的实例会生成一个初始种子 使用内部熵源,例如 /dev/urandom。这颗种子是 不可预测且适合安全使用。

    只需使用 KeyPairGenerator 类:

        KeyPair keys = null;
        try {
            RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(1024, RSAKeyGenParameterSpec.F4);
            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
            keyGen.initialize(spec);
            keys = keyGen.generateKeyPair();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    
        if(keys != null){
            PublicKey mPublicKey = (PublicKey) keys.getPublic();
            PrivateKey mPrivateKey = (PrivateKey) keys.getPrivate();
        }
    

    【讨论】:

    • 不,每次都是同一个键。伙计,这让我发疯了。
    • 这看起来很简单,但我有一个单元测试可以创建它的实例,并且密钥始终相同。
    • 您是否尝试使用 KeyPairGenerator 生成 RSA 密钥?
    • 是的,这就是我正在使用的。我可能错误地假设它正在生成相同的密钥。我需要对我的对象进行更多测试,感谢您确认我做对了。
    • 我测试了这段代码,key不一样,可能有很多equals字节,但不一样。
    【解决方案2】:

    这个问题的最终答案是将海绵城堡从充气城堡添加到我的应用程序中。

    【讨论】:

      【解决方案3】:

      我对此的最终解决方案是将 spongycastle 提供程序添加到我的应用程序中。一旦我这样做了,键就开始随机了。

      【讨论】:

        猜你喜欢
        • 2010-09-08
        • 2023-04-04
        • 1970-01-01
        • 2013-07-18
        • 2012-04-09
        • 1970-01-01
        • 2015-03-06
        • 2011-01-28
        • 1970-01-01
        相关资源
        最近更新 更多