首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过OpenSSL保护嵌入式服务器的一次性密码

通过OpenSSL保护嵌入式服务器的一次性密码
EN

Security用户
提问于 2017-05-31 15:55:30
回答 1查看 1K关注 0票数 1

我正在开发一个应用程序来保护客户机和嵌入式linux服务器之间的通信。我对密码学领域非常陌生,所以在这一阶段,我更多地寻求指导--尤其是在我的方法中涉及到漏洞时。

服务器将不会连接到互联网。我正在寻找一种实现一次性密码身份验证的方法--(可能OTP是通过客户机和服务器之间交换的一些共享秘密生成的)。我不想在服务器上存储静态密钥,所以我在想一些类似使用Diffie-Hellman临时密钥交换的东西,可以用来交换这些密钥或类似的东西。有人能给我一些关于如何解决这个问题的建议吗?或者,如果已经解决了这个问题,那就更好了。我正在考虑使用OpenSSL将服务器组装在一起,而客户机需要更加开放& Java/C++/Platform不可知论。也许有一些类似于此的OpenSSL示例,如果是这样的话,请将它们一起发送。

编辑:所以,自从昨天发布这个问题以来,我一直在做一些实验。我能够验证,我可以成功地创建一个共享秘密,使用一个短暂的Diffie-Hellman密钥交换。我得到了一个使用C++库工作的概念的OpenSSL证明,如下面的代码块所示(我在网上找到了各种片段,很抱歉丢失了链接)。据我所知,这应该足以在客户端和服务器之间获得一次密码。对于后一种解决方案,我考虑链接到宣誓工具包库,以支持HOTPTOTP算法。

这样做的想法是,一旦交换了共享秘密,服务器就可以使用共享秘密和一些服务器随机数据组成OTP。一旦客户端知道了这个OTP,他们就会提供它来登录和认证。我不知道我是否完全搞错了,如果我的建议是不可能的(或更有可能充满漏洞)。

下面的代码块显示了如何使迪夫-赫尔曼共享秘密是相同的(给定通过DH_生成_参数_例如建立的公共生成器和素数).并使用DHparams_dup API为客户端和服务器克隆DH密钥,通过EVP_PKEY_set1_DH调用替换)

代码语言:javascript
复制
auto dhparams = DH_new();
if ( DH_generate_parameters_ex(dhparams, 512, DH_GENERATOR_5, nullptr) != 0 ) {
    // duplicate the existing parameters for alice
    auto dhparams_alice = DHparams_dup(dhparams);
    // generate Alice's private and public key values
    // should return 1 for success
    auto res = DH_generate_key(dhparams_alice);

    // Use the same generator and bitlength parameters
    auto dhparams_bob = DHparams_dup(dhparams);
    // generate Bob's private and public key values
    // should return 1 for success
    res = DH_generate_key(dhparams_bob);

    auto key_alice = EVP_PKEY_new();
    // should return 1 for success
    res = EVP_PKEY_set1_DH(key_alice, dhparams_alice);

    auto key_bob = EVP_PKEY_new();
    // should return 1 for success
    res = EVP_PKEY_set1_DH(key_bob, dhparams_bob);

    // Compute the shared secret using Alice's private key and Bob's public key.
    // unique pointer, so automatically destroyed.
    size_t keyLen1 = 0;
    auto key1 = dh_derive(key_alice, key_bob, keyLen1);

    // Compute the shared secret using Bob's private key and Alice's public key.
    // unique pointer, so automatically destroyed.
    size_t keyLen2 = 0;
    auto key2 = dh_derive(key_bob, key_alice, keyLen2);
            
    // Prove correctness by showing Alicia and Beth derived the same secret
    if (keyLen1 != keyLen2 || memcmp(key1.get(), key2.get(), keyLen1) != 0) {
        std::cout << "Shared Secret different" << std::endl;                
    }

    EVP_PKEY_free(key_alice);
    EVP_PKEY_free(key_bob);
    DH_free(dhparams_alice);
    DH_free(dhparams_bob);
    DH_free(dhparams);
EN

回答 1

Security用户

发布于 2017-05-31 16:43:03

所以你根本想做双因素授权?(还是我误解了?)

我只需使用TOTP (基于时间的一次密码),它成为双因素授权的标准。

优势

  • 标准化方法
  • 兼容或几乎每一种选择
  • 很容易使用现有的实现或自己实现。
  • 您不需要在线,也不需要连接到服务器。

Disadvantages

  • 您必须以一种安全的方式存储客户端的秘密,以确保它不会在数据泄露时泄漏。
  • 谁知道这个秘密能在他想要的任何时候产生密码。(但在加密方面,这种情况很常见)
票数 2
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/160873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档