【问题标题】:Generate encoded docket number from two integers and decode it [javascript]从两个整数生成编码的案卷编号并对其进行解码[javascript]
【发布时间】:2022-09-27 11:01:56
【问题描述】:

我正在尝试从 storeId 和 transactionId 生成编码的案卷编号。编码的案卷编号必须是唯一的,长度应 <=9 并且用户也易于阅读/复制。

storeId 的最大长度为 3,transactionId 的最大长度为 5。

如何改进我的代码,使我的案卷号码牢不可破?

这是我的代码:

let myTransKey = 19651;
let myStoreKey = 186;

function generateShortCode(storeId, transactionId) {
  //reverse the ids and then add the respective key
  var SID = storeId.toString().split(\"\").reverse().join(\"\");
  SID = parseInt(SID) + myStoreKey;
  var TID = transactionId.toString().split(\"\").reverse().join(\"\");
  TID = parseInt(TID) + myTransKey;
  var docketNum = `${SID}-${TID}`;
  return docketNum;
}


function decodeShortCode(shortCode) {
  shortCode = shortCode.split(\"-\");
  var storeID = shortCode[0];
  var transactionID = shortCode[1];

  //subtract the same key and then reverse the ids again
  storeID = parseInt(storeID.toString()) - myStoreKey;
  storeID = storeID.toString().split(\"\").reverse().join(\"\");

  transactionID = parseInt(transactionID.toString()) - myTransKey;
  transactionID = transactionID.toString().split(\"\").reverse().join(\"\");

  return {
    storeId: parseInt(storeID), // store id goes here,
    shopDate: new Date(), // the date the customer shopped,
    transactionId: parseInt(transactionID) // transaction id goes here
  };
}

有没有更好的方法来做到这一点?我需要将案卷编号编码为任何第三人都很难解码的案卷编号。 非常感谢您的帮助。

  • 您想使用加密,而不是您使用的任何方法。

标签: javascript decode encode uniqueidentifier generate


【解决方案1】:

如果攻击者尝试所有可能的解密密钥(这称为蛮力攻击),则每条加密消息都可能被破坏。使用现代计算机,这真的很容易做到。您编码数据的方式很容易被破解(在几秒钟内)。但是,有些加密方法需要很长时间才能破解(例如数百万年)。

一种比较流行的加密算法是AES。因为它非常流行,所以也有许多易于使用的 JavaScript 库。这是CryptoJS 的示例:

const KEY = "a super secret password";

let myTransKey = 19651;
let myStoreKey = 186;

function generateShortCode(storeId, transactionId) {
  const docketNum = `${storeId}-${transactionId}`;
  return CryptoJS.AES.encrypt(docketNum, KEY).toString().replace("=", "");
}


function decodeShortCode(shortCode) {
  const docketNum = CryptoJS.AES.decrypt(shortCode, KEY).toString(CryptoJS.enc.Utf8);
  const parts = docketNum.split("-");
  return {
    storeId: parseInt(parts[0]), // store id goes here,
    shopDate: new Date(), // the date the customer shopped,
    transactionId: parseInt(parts[1]) // transaction id goes here
  };
}

const s1 = generateShortCode(myStoreKey, myTransKey);
console.log("Short Code: " + s1);
console.log("Decrypted Short Code:", decodeShortCode(s1));
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js" integrity="sha256-/H4YS+7aYb9kJ5OKhFYPUjSJdrtV6AeyJOtTkw6X72o=" crossorigin="anonymous"&gt;&lt;/script&gt;

此短代码可能比预期的要长,但它非常安全且几乎牢不可破。

请务必将KEY 更改为不与任何人共享的密钥。此外,请确保不要在客户端运行此代码。如果加密密钥被发送到客户端,那么他们可以查看 JavaScript 代码,然后能够解密任何消息。

【讨论】:

  • 如果此答案解决了您的问题,那么您可以将其标记为正确,以便将来帮助其他人解决同样的问题。
猜你喜欢
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多