我正在开发一个应用程序来保护客户机和嵌入式linux服务器之间的通信。我对密码学领域非常陌生,所以在这一阶段,我更多地寻求指导--尤其是在我的方法中涉及到漏洞时。
服务器将不会连接到互联网。我正在寻找一种实现一次性密码身份验证的方法--(可能OTP是通过客户机和服务器之间交换的一些共享秘密生成的)。我不想在服务器上存储静态密钥,所以我在想一些类似使用Diffie-Hellman临时密钥交换的东西,可以用来交换这些密钥或类似的东西。有人能给我一些关于如何解决这个问题的建议吗?或者,如果已经解决了这个问题,那就更好了。我正在考虑使用OpenSSL将服务器组装在一起,而客户机需要更加开放& Java/C++/Platform不可知论。也许有一些类似于此的OpenSSL示例,如果是这样的话,请将它们一起发送。
编辑:所以,自从昨天发布这个问题以来,我一直在做一些实验。我能够验证,我可以成功地创建一个共享秘密,使用一个短暂的Diffie-Hellman密钥交换。我得到了一个使用C++库工作的概念的OpenSSL证明,如下面的代码块所示(我在网上找到了各种片段,很抱歉丢失了链接)。据我所知,这应该足以在客户端和服务器之间获得一次密码。对于后一种解决方案,我考虑链接到宣誓工具包库,以支持HOTP或TOTP算法。
这样做的想法是,一旦交换了共享秘密,服务器就可以使用共享秘密和一些服务器随机数据组成OTP。一旦客户端知道了这个OTP,他们就会提供它来登录和认证。我不知道我是否完全搞错了,如果我的建议是不可能的(或更有可能充满漏洞)。
下面的代码块显示了如何使迪夫-赫尔曼共享秘密是相同的(给定通过DH_生成_参数_例如建立的公共生成器和素数).并使用DHparams_dup API为客户端和服务器克隆DH密钥,通过EVP_PKEY_set1_DH调用替换)
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);发布于 2017-05-31 16:43:03
所以你根本想做双因素授权?(还是我误解了?)
我只需使用TOTP (基于时间的一次密码),它成为双因素授权的标准。
https://security.stackexchange.com/questions/160873
复制相似问题