Mar*_*ark 10 java security fraud-prevention e-commerce
我正在为一家生产礼品卡代码的公司工作,该代码可用于在网上商店支付货款.
我想知道生成这些礼品卡代码最安全的方法是什么.长度需要是16个字符(虽然可以协商)并且可以是字母数字(虽然数字会更加客户友好).
从我所看到的,最安全的方法是使用以下Java代码生成特定长度的礼品卡代码:
static final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static SecureRandom rnd = new SecureRandom();
String randomString( int len ){
StringBuilder sb = new StringBuilder( len );
for( int i = 0; i < len; i++ )
sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
这取自这里的答案.我从字符串中删除了小写字母,使其更加用户友好.所以这产生了36 ^ 16种组合.单独的数字将是10 ^ 16种组合.我认为数字本身就够了,但经常强调,鉴于礼品卡欺诈越来越普遍,字符串应该是字母数字.
这就是问题一:数字还是字母数字?
当用户使用在线商店的礼品卡支付商品时,我们会拨打电话,返回该礼品卡的余额和货币.鉴于礼品卡代码是在第三方服务器上输入的,现在这些礼品卡可供有权访问这些服务器的人使用.在用户部分兑换之后仍然存在余额的情况下,这显然是一个问题.
一种选择是,当我们调用我们的API(使用礼品卡代码)以获得余额时,我们返回并在他们的商店中保存一个随机字符串,只有当他们向我们开帐单时才能由在线商店使用 - 我们会将其与我们系统上的礼品卡代码相匹配.问题可能是用户在结账时输入的礼品卡代码会记录在他们的日志中的某个位置,任何有权访问这些日志的人都可以访问.
另一个选择是我们在部分兑换后刷新礼品卡代码.因此,用户基本上获得了用于余额的新礼品卡代码,并且前一个被取消.这可能是最安全的,但不是那么用户友好.
这就是第二个问题:我们如何确保仅部分兑换的礼品卡代码仍然有价值?
所以你面临的问题是一个有趣的问题。我读了@Therac 的问题解决方案,我必须同意他的观点,即你最终会创建一个类似于加密货币的协议。我也同意他所有的密码学建议。
我不会重复@Therac 的解决方案,但是,我会看看是否可以通过解释加密货币的一些想法来提供帮助。我不会讨论太多技术细节,但会从表面上讲,您可以自己判断这个想法是否适合您的用例。
所以大多数加密货币使用的数据结构是 Merkle 哈希树。他们的想法是,他们将其保留为仅附加的交易日志,以验证以前的交易,并且它们不会被双重花费。
所以有两种类型的交易。
创建交易仅在由贵公司签署后才有效。因此,您将存储您提供的金额、用户的公共地址(可能是他的帐号)和他的礼品卡代码。
第二种交易是 SpendGiftCode。这需要该人的礼品卡代码,并且还需要他签署交易以验证交易是否来自他。
然后 SpendGiftCode 完全消耗礼品卡代码(销毁礼品卡代码并存储已使用的信息)并执行以下两项操作之一:
giftcardcode会向他付款对象的公共地址(即其他方的帐号)生成一个新地址。giftcardcodes生成两个。其中 10 美元将发送给另一方,并将giftcardcode剩余金额中的新金额发送回他的帐户。这需要为您的用户和供应商创建帐户,但可以帮助缓解双重支出和跟踪等问题。由于它是仅附加日志,因此您将能够跟踪每个供应商和用户进行的交易。Merkle哈希树允许优化日志保存。
当然,有几层技术困难我没有深入探讨,而且我的解释中当然存在一些情节漏洞,因为我试图提供一个广泛的概念想法。如果您发现错误,请随时进行编辑。希望这对您有所帮助,
干杯!
| 归档时间: |
|
| 查看次数: |
761 次 |
| 最近记录: |