Google,Stripe和其他许多公司都有公共API密钥和Secret API密钥。
生成随机字符串很容易,但是我的问题是,如何生成公共密钥和秘密密钥,存储它们并正确使用它们?
公共API密钥用于告诉用户是谁,秘密在于确认其身份。
我的流程如下: -用户创建一个帐户 -用户激活服务(内部) -服务返回一个公共密钥和一个秘密API密钥(UARRHAtPtJcLxx5RmMWo9oTrca4gRt2k,C9YS7Mhzichq2vqBuRkNJxkNci5W2Xua) -用户使用其网站上的公钥和服务器端上的私钥
我使用的是nodejs,当用户要求提供API密钥时,按需生成了公共密钥:
let public = await crypto.randomBytes(32).toString('base64');
将机密存储在数据库中就像用明文存储密码。 我认为我们不希望这样做,并且需要以某种方式对其进行哈希处理。我是否生成一个“私有”密钥并使用argon2对其进行哈希处理?用户将永远无法再次看到他/她的密钥,因此需要立即保存,这是一个好习惯吗?
我找不到太多有关该如何工作的信息。
答案 0 :(得分:5)
从技术上讲,您所指的只是用户名和密码。唯一重要的区别是这些通常由 API 生成并且非常随机,而不是由用户选择的真实用户名和密码,并且通常不是非常随机。 (调用这些公钥和私钥有点误导,因为公钥密码学是不同的——API 密钥通常不需要它,管理 PKI 是一堆蠕虫,而且正确执行它的成本也很高。)>
由于这些在技术上与用户名和密码相同,因此您希望以类似方式对待它们。让我们称这些客户端 ID(“公共”部分)和客户端密钥(“秘密”部分)。
一些想法:
crypto.randomBytes()
如上所述很好。log2(62^22) =~ 130.99
)。当然,您可以随时使用更长的时间,对于 256 位,您需要长度为 43 且区分大小写的字母数字。答案 1 :(得分:0)
我认为我们可以使用以下代码生成一对公共密钥和私有密钥(私钥)。您可以参考链接link to generate key pair here doc
var pk="";
var sk="";
var string= payload;
const { generateKeyPair } = require('crypto');
generateKeyPair('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: 'top secret'
}
}, (err, publicKey, privateKey) => {
try {
pk=publicKey;
sk=privateKey;
} catch (error) {
console.log(err)
}
});
现在我们有了秘密密钥和公钥。...因此我们可以实现HMAC身份验证... ref .. go for hmac authentication doc
var hmac = crypto.createHmac('sha384', sk).update(string).digest('hex');
request.post({uri:..., json: { hmac, pk, string }, function(err, response, body) {
console.log(body);
});