Я работаю в компании, которая генерирует коды подарочных карт, которые можно использовать для оплаты товаров в интернет-магазинах.
Мне интересно, каков наиболее безопасный способ создания этих кодов подарочных карт. Длина должна быть 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();
}
Это взято из ответа SO здесь. Я удалил строчные буквы из строки, чтобы сделать ее более удобной для пользователя. Таким образом получается 36 ^ 16 комбинаций. Только числовые значения составят 10 ^ 16 комбинаций. Я считаю, что одного числа было бы достаточно, но часто подчеркивается, что, учитывая растущую распространенность мошенничества с подарочными картами, строка должна быть буквенно-цифровой.
Итак, вопрос первый: числовой или буквенно-цифровой?
Когда пользователи используют подарочные карты в интернет-магазине для оплаты товаров, происходит вызов нашего API, который возвращает баланс и валюту для этой подарочной карты. Учитывая, что коды подарочных карт вводятся на сторонних серверах, эти подарочные карты теперь доступны людям, имеющим доступ к этим серверам. Это, очевидно, проблема в том случае, когда баланс все еще остается после того, как пользователь частично погасил его.
Один из вариантов - при вызове нашего API (с кодом подарочной карты) для получения баланса мы возвращаем и сохраняем в их магазине случайную строку, которая может использоваться только интернет-магазином, когда они выставляют нам счет. - мы сопоставим это с кодом подарочной карты в нашей системе. Проблема с этим, предположительно, заключается в том, что код подарочной карты, который пользователь вводит при оформлении заказа, регистрируется где-то в их журналах и доступен для всех, у кого есть доступ к этим журналам.
Другой вариант - обновить код подарочной карты после ее частичного использования. Таким образом, пользователю по сути выдается новый код подарочной карты для баланса, а предыдущий аннулируется. Это, наверное, самый безопасный, но не очень удобный для пользователя.
Итак, вот второй вопрос: как защитить коды подарочных карт, которые используются только частично, но на них еще сохраняется ценность?