我正在为一家公司工作,他们生成礼品卡代码,可以用于在线商店购买商品。
我想知道生成这些礼品卡代码最安全的方法是什么。长度需要为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();
}
这段内容摘自于stackoverflow的回答(这里)。我从字符串中删除了小写字母,以使其更加用户友好。因此,这产生了36 ^ 16个组合。仅数字将产生10 ^ 16个组合。我相信仅数字就足够了,但由于礼品卡欺诈日益普遍,通常强调字符串应为字母数字混合。
那么问题一是:数字还是字母数字混合?
当用户在在线商店使用礼品卡支付商品时,会调用我们的 API 返回该礼品卡的余额和货币类型。由于礼品卡代码是在第三方服务器上输入的,这些礼品卡现在对那些访问这些服务器的人可用。如果用户部分兑换后仍有余额,则显然存在问题。
其中一种选择是,在调用我们的API时(使用礼品卡代码获取余额),我们返回并在他们的商店上保存一个随机字符串,只有在线商店在向我们结算时才能使用 - 我们将在系统上与礼品卡代码匹配。问题在于,用户在结账时输入的礼品卡代码可能被记录在他们的日志中,并且可以被任何访问这些日志的人访问。
另一种选择是,在礼品卡部分兑换后刷新礼品卡代码。因此,用户实际上会获得一个新的礼品卡代码用于余额,而之前的代码将被取消。这可能是最安全的,但不太友好。
那么第二个问题是:我们如何保护仍具有价值的部分兑换的礼品卡代码?