【问题标题】:How to encrypt data being sent using API如何加密使用 API 发送的数据
【发布时间】:2018-01-06 19:04:15
【问题描述】:

我正在使用 API 开发一个项目。现在我正在尝试加密数据,因此没有人可以编辑它。我想过使用公钥加密数据,使用私钥加密公钥和(加密数据)。但我无法使用 API uri 发送此加密数据,因为它包含“/”字符。
加密我的 JSON 数据以便没有人可以编辑它的最佳方法是什么?
以下是 Json 的示例:

{
        "Name": "HP Laptop",
        "Category": "Laptop",
        "Price": 300,
        "Currency": "OMR",
        "details": "core i 5 ",
        "productID": 1,
        "Quantity": 10
    }

【问题讨论】:

  • 是get方法吗?
  • 发布方法@PowerStar
  • 你能告诉我们发布方法吗?如果您添加加密字符串请求正文,则不会有任何 url 问题.. 好的,请告诉我们您的方法。
  • 如果问题只是数据中的 / 那么您是否使用 System.Uri.EscapeDataString() 对其进行了编码?
  • @jcubic — 这不是加密!它可以通过 ASCII 协议传输二进制数据。它提供零安全性。

标签: javascript json api encryption


【解决方案1】:

对于任何安全协议,最好始终遵守标准。永远不要试图发明你自己的协议。你最终可能弊大于利。如果此数据是通过 HTTP 传输的,则可以随意使用 SSL (HTTPS) 来防范 MiTM 攻击,例如窃听和篡改。但是,我认为您正在寻找不同的东西。

虽然 SSL 应确保数据不会在旅行中被篡改,但您可能正在自己执行此操作,例如,有人将一些数据交给您,但您不确定它是否未被篡改。要免费执行此操作,请利用该数据的数字签名,其中数字签名的私钥由您持有。

类似这样的:

  1. 生成密钥对(私有、公共)。
  2. 用私钥Sign(json, private) -> signedDocument对json签名。
  3. 现在,稍后当您想验证没有人篡改时:Verify(public, signedDocument, json) = True 如果文档未被篡改(概率极高),False 如果文档已被篡改(再次使用概率极高)。

这里是合理技术倾向的数字签名的伟大初读:https://en.wikipedia.org/wiki/Digital_signature

我相信这可能是 JS 入门的好地方:http://www-cs-students.stanford.edu/~tjw/jsbn/(我希望斯坦福在实现 RSA 方面做得不错,但请随意四处寻找更标准的东西。如果这是 Java,那么它可能会更容易......也许写一个 CryptoWebServer 来支持这个操作?)

为了进一步参考,我相信这个库现在维护在这里:https://github.com/kjur/jsrsasign/wiki/Tutorial-for-Signature-class

我直接从图书馆的教程中举了一个签名+验证的例子。请注意,这只解决了签名和验证的问题,您仍然需要生成公钥/私钥对。

签署消息“aaa”(您将在此处使用 .json 有效负载):

// initialize
var sig = new KJUR.crypto.Signature({"alg": "SHA1withRSA"});
// initialize for signature generation
sig.init(rsaPrivateKey);   // rsaPrivateKey of RSAKey object
// update data
sig.updateString('aaa')
// calculate signature
var sigValueHex = sig.sign()

这里是一个签名验证的例子:

// initialize
var sig = new KJUR.crypto.Signature({"alg": "SHA1withRSA"});
// initialize for signature validation
sig.init("-----BEGIN CERTIFICATE-----(snip)"); // signer's certificate
// update data
sig.updateString('aaa')
// verify signature
var isValid = sig.verify(sigValueHex)

【讨论】:

  • 感谢我的朋友,我是密码学新手,所以我面临很多困难。但是,我相信你说得对,所以你能帮我找到一个资源来学习如何执行你建议的解决方案吗?
  • @MohammedAlAamri 请随时查看发送的 GitHub 链接。他们有用于创建和验证签名的优秀类。您将需要更深入地了解如何生成您的私钥和公钥对。我通常会用ssh-keygen 来做这件事。将您的私钥隐藏在公众视线之外!您不需要加密公钥.. 与任何人分享!
  • 而且可能 Sha2 会更好的安全性。
猜你喜欢
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
相关资源
最近更新 更多