Java:此代码安全吗?
Java: Is This Code Safe?
我正在制作一个 Android 应用程序,目前已经创建了一些用于生成代码的代码。生成的代码将对照数据库进行检查,以查看该代码是否在使用中。如果是,它将重新生成另一个代码,直到找到未使用的代码。这是使用 do-while 循环完成的,虽然没有代码,但对用户来说不会有明显的延迟。但是,如果有大量代码,会有明显的延迟,不是吗?代码如下:
public static String generateCode(DBAdapter myDB, String mgrName){
String[] name = mgrName.split(" +");
String fName = name[0];
String lName = name[1];
String fLetter = fName.substring(0, 1).toUpperCase();
String lLetter = lName.substring(0, 3).toUpperCase();
int randomPIN = (int) (Math.random() * 9000) + 1000;
String pin = String.valueOf(randomPIN);
String letters = new StringBuilder().append(fLetter).append(lLetter).append(pin).toString();
Boolean result = checkCode(myDB, letters);
if(result == true){
return(letters);
}
else{
String code = "";
Boolean resultfail = false;
do{
int randomPINFail = (int) (Math.random() * 9000) + 1000;
String generatedCode = new StringBuilder().append(fLetter).append(lLetter).append(randomPINFail).toString();
Boolean check = checkCode(myDB, generatedCode);
if(check){
resultfail = true;
code = generatedCode;
}
}while(!resultfail);
return code;
}
}
public static Boolean checkCode(DBAdapter myDB, String code){
Cursor cursor = myDB.getRowComplaint(code);
if(cursor.getCount() == 0){
return true;
}
else{
return false;
}
}
我的问题是,生成器选择一个已被多次使用以致于用户会注意到延迟的代码的可能性有多大?请记住,生成器将使用不同的经理名称和不同的号码。这段代码可以安全使用吗?如果不是,可以采取什么措施使其安全?
编辑:我不能使用 UUID,因为用户要求代码包含四个字母和四个数字。该代码用于从数据库中检索数据,这就是它需要唯一的原因。
与任何与性能相关的问题一样,我们无法回答 - 您应该通过创建大量现有行然后查看速度有多慢来自行分析它。
就安全性而言,这是一个非常宽泛的术语,我对您使用这些代码的目的一无所知,因此我无法轻松地告诉您该代码是安全的。但是您访问数据库的方式似乎没有任何可怕的问题。
只需使用 UUID
class 或任何其他内置伪随机数生成器 - 不要重新发明轮子。从理论上讲,它们将提供如此小的冲突率,以至于在绝对大多数情况下,您将在第一次尝试时生成唯一的 ID。但同样,这取决于您的用例。我假设您正在做一些理智的事情,而不是在移动设备上生成和存储数以百万计的代码。
确保不要从主线程调用此例程 - 在这种情况下,即使您的数据库为空,使用也可能会注意到延迟。
我正在制作一个 Android 应用程序,目前已经创建了一些用于生成代码的代码。生成的代码将对照数据库进行检查,以查看该代码是否在使用中。如果是,它将重新生成另一个代码,直到找到未使用的代码。这是使用 do-while 循环完成的,虽然没有代码,但对用户来说不会有明显的延迟。但是,如果有大量代码,会有明显的延迟,不是吗?代码如下:
public static String generateCode(DBAdapter myDB, String mgrName){
String[] name = mgrName.split(" +");
String fName = name[0];
String lName = name[1];
String fLetter = fName.substring(0, 1).toUpperCase();
String lLetter = lName.substring(0, 3).toUpperCase();
int randomPIN = (int) (Math.random() * 9000) + 1000;
String pin = String.valueOf(randomPIN);
String letters = new StringBuilder().append(fLetter).append(lLetter).append(pin).toString();
Boolean result = checkCode(myDB, letters);
if(result == true){
return(letters);
}
else{
String code = "";
Boolean resultfail = false;
do{
int randomPINFail = (int) (Math.random() * 9000) + 1000;
String generatedCode = new StringBuilder().append(fLetter).append(lLetter).append(randomPINFail).toString();
Boolean check = checkCode(myDB, generatedCode);
if(check){
resultfail = true;
code = generatedCode;
}
}while(!resultfail);
return code;
}
}
public static Boolean checkCode(DBAdapter myDB, String code){
Cursor cursor = myDB.getRowComplaint(code);
if(cursor.getCount() == 0){
return true;
}
else{
return false;
}
}
我的问题是,生成器选择一个已被多次使用以致于用户会注意到延迟的代码的可能性有多大?请记住,生成器将使用不同的经理名称和不同的号码。这段代码可以安全使用吗?如果不是,可以采取什么措施使其安全?
编辑:我不能使用 UUID,因为用户要求代码包含四个字母和四个数字。该代码用于从数据库中检索数据,这就是它需要唯一的原因。
与任何与性能相关的问题一样,我们无法回答 - 您应该通过创建大量现有行然后查看速度有多慢来自行分析它。
就安全性而言,这是一个非常宽泛的术语,我对您使用这些代码的目的一无所知,因此我无法轻松地告诉您该代码是安全的。但是您访问数据库的方式似乎没有任何可怕的问题。
只需使用 UUID
class 或任何其他内置伪随机数生成器 - 不要重新发明轮子。从理论上讲,它们将提供如此小的冲突率,以至于在绝对大多数情况下,您将在第一次尝试时生成唯一的 ID。但同样,这取决于您的用例。我假设您正在做一些理智的事情,而不是在移动设备上生成和存储数以百万计的代码。
确保不要从主线程调用此例程 - 在这种情况下,即使您的数据库为空,使用也可能会注意到延迟。