我正在为一家生成礼品卡代码的公司工作,该代码可用于在网上商店购买商品。
我想知道生成这些礼品卡代码的最安全方法是什么。长度需要为 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();
}
这取自这里的 Stack Overflow 答案。我从字符串中删除了小写字母以使其更加用户友好。所以这会产生36 ^ 16
组合。单独的数字将是10 ^ 16
组合。我相信仅数字就足够了,但人们经常强调,鉴于礼品卡欺诈的日益普遍,字符串应该是字母数字。所以这是问题一:数字还是字母数字?
当用户在在线商店使用礼品卡支付商品时,会调用我们的 API,返回该礼品卡的余额和货币。鉴于礼品卡代码是在第三方服务器上输入的,这些礼品卡现在可供有权访问这些服务器的人使用。这在用户部分赎回后仍有余额的情况下显然是一个问题。
一种选择是,当调用我们的 API(使用礼品卡代码)以获取余额时,我们返回并在他们的商店中保存一个随机字符串,该字符串只能在在线商店向我们收费时使用- 我们会将其与系统上的礼品卡代码相匹配。问题可能是用户在结帐时输入的礼品卡代码被记录在他们的日志中的某个地方,并且任何有权访问这些日志的人都可以访问。
另一种选择是我们在部分兑换后刷新礼品卡代码。因此,用户基本上会获得余额的新礼品卡代码,而之前的礼品卡代码将被取消。这可能是最安全的,但不是那么用户友好。所以这是第二个问题:我们如何保护仅部分兑换并仍然具有价值的礼品卡代码?
编辑:
我们还有一个检查余额页面,用户输入礼品卡代码并返回货币和余额。这可能会产生一些额外的安全问题。