【问题标题】:Which key-pair type to use in libsodium? What are the different capabilities of each?在 libsodium 中使用哪种密钥对类型?各有什么不同的能力?
【发布时间】:2019-07-04 12:02:44
【问题描述】:

我想使用合适的 libsodium 密钥对作为用户身份,但我还不知道我将提供哪些加密功能。

libsodium 中似乎有 3 种类型的密钥对生成:

crypto_box_keypair()
crypto_kx_keypair()
crypto_sign_keypair()

此外,似乎有 3 种类型的键:

// Source: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/libsodium-wrappers/index.d.ts
export type KeyType = 'curve25519' | 'ed25519' | 'x25519';

我不知道哪个密钥类型对应哪个密钥对生成函数,或者它们是否完全对应。

所以,问题:

  1. 每个密钥对都设计用于某些功能(例如,crypto_box_keypair()crypto_box_easy())。密钥对类型与加密功能/能力之间的兼容性矩阵是什么?
  2. 如果有一种可以用于所有功能的键类型,它是哪一种?

【问题讨论】:

  • 这个问题似乎颠倒了。听起来你在说,我想用一个库,但我不知道我想写什么样的程序。这就像本末倒置。

标签: javascript cryptography public-key libsodium nacl-cryptography


【解决方案1】:

如果要为box 操作创建密钥对,请使用crypto_box_keypair()

如果您需要密钥对进行签名,请使用crypto_sign_keypair()

如果您需要密钥对进行密钥交换,请使用crypto_kx_keypair()

不保证一个操作的键可用于不同的操作。密码学中的一个良好卫生习惯是永远不要将密钥用于两种不同的目的。

如果您需要为密钥交换和签名派生密钥对,您可以为此使用crypto_kx_seed_keypair()crypto_sign_ed25519_seed_keypair()。框操作还提供crypto_box_seed_keypair()

这些函数确定性地从种子中派生密钥对。该种子可以被视为您的实际密钥,您可以从中计算出不同类型的密钥对。

【讨论】:

  • 谢谢,但是,例如,crypto_box_keypair()crypto_sign_keypair() 产生相同类型的密钥,所以它们现在确实无法操作。我知道他们不能保证,但我希望有人知道 libsodium 的确切情况:))。对于“良好的卫生习惯”,我能知道在这种特定情况下为什么吗?如果可以的话,为什么不在这个特定的特定设置中将同一个密钥用于多种目的?关于种子,我想要一个用户的公共标识符,我将如何使用种子?如果我使用一个密钥对,我将使用相应的公钥来完成。
  • What is the purpose of using separate key pairs for signing and encryption? - Why should one not use the same asymmetric key for encryption as they do for signing?。使用不同的键。您发布的公钥可以是两个公钥的串联,尤其是因为它们非常短。
  • 我认为您应该使用crypto_sign_seed_keypair 而不是crypto_sign_ed25519_seed_keypair - 即使第一个调用第二个,第一个也不那么混乱。
  • 文档现在有一个关于这个主题的部分:How can I sign and encrypt using the same key pair?
猜你喜欢
  • 2013-07-14
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多