web-dev-qa-db-ja.com

6桁のOTP番号を生成する方法

ログイン認証システムのOTP番号とは何ですか? Java(Android)を使用してOTP番号を生成するための特定のアルゴリズムはありますか?またはOTPは乱数のようなものですか?最適化を使用してこれをどのように実現できますか?.

3

特にセキュリティと暗号化の場合は、車輪の再発明をしないでください。あなたは本当に悪い状態になってしまうかもしれません。

Open Authentication Iniativeによって指定されたHOTPおよびTOTPアルゴリズムのように、コミュニティが合意したアルゴリズムを使用します。これらのアルゴリズムは、Google認証者によっても使用され、これらのRFCで指定されています。それらを読みます。それらは単純です。

http://tools.ietf.org/html/rfc4226

https://tools.ietf.org/html/rfc6238

18
cornelinux

Google認証システムを確認してください。 : https://github.com/google/google-authenticator OTP機能を備えたオープンソースプロジェクトです

Android app https://code.google.com/p/google-authenticator/source/browse/?repo=Android のソースコード

サーバー側のソースコードは次のとおりです https://github.com/chregu/GoogleAuthenticator.php

ウィキペディアの記事 http://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm

4
Rajan Bhavsar

最も簡単な方法は、RandomクラスでDecimalFormatを使用することです。

String otp= new DecimalFormat("000000").format(new Random().nextInt(999999));
System.out.println(otp);

サンプル出力、

002428
445307
409185
989828
794486
213934
2
REMITH
protected void onCreate(Bundle savedInstanceState)
 {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Random otp  =new Random();

        StringBuilder builder=new StringBuilder();
        for(int count=0; count<=10;count++) {
            builder.append(otp.nextInt(10));
        }
        Log.d("Number", " " + builder.toString());

        TextView txt = (TextView) findViewById(R.id.txt);

        txt.setText(builder.toString());
   }
2
Aditya Vats

私はそれについての簡単なルールを見つけるのと同じ困難を抱えています。

「TimeSynchronized」など、OTPについて説明するコンテンツはたくさんありますが、システムのセキュリティを維持しながら、簡単な解決策を探していました。

私の場合、2FA(Two Factor Authentication)を保持していますが、これはすでに多くのセキュリティを提供しています。

乱数ジェネレーターのJava)に関する関連情報(SecureRandomを参照)一意の番号を生成する場合は、繰り返しを避けてください。

例:

https://www.securecoding.cert.org/confluence/display/Java/MSC02-J.+Generate+strong+random+numbers

詳細: http://resources.infosecinstitute.com/random-number-generation-Java/

上記の例に基づいて、次のスニペットを実装しました。

public class SimpleOTPGenerator {


    protected SimpleOTPGenerator() {
    }

    public static String random(int size) {

        StringBuilder generatedToken = new StringBuilder();
        try {
            SecureRandom number = SecureRandom.getInstance("SHA1PRNG");
            // Generate 20 integers 0..20
            for (int i = 0; i < size; i++) {
                generatedToken.append(number.nextInt(9));
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        return generatedToken.toString();
    }
}
2
public static void main(String []args){
            Java.util.Random r=new Java.util.Random();
            int otp = r.nextInt(1000000); // no. of zeros depends on the OTP digit
            System.out.println(otp);
}
0
Zoha Irshad
First of all OTP stands for one time password it is used for the authentication and 
verification this is code is for Java implemented in netbeans IDE
 You have to register on the msg91.com for the api genration and that gives free 250 
 msgs.
import Java.io.BufferedReader;
import Java.io.InputStreamReader;
import Java.net.HttpURLConnection;
import Java.net.URL;
import Java.util.Random;
import javax.swing.JOptionPane;
 public class SMS {
String num,otp;
SMS(String mob)
{
    num=mob;

}
 static String otpGenerator() 
{ 
    String numbers = "0123456789"; 
    String x="";
    Random rndm_method = new Random(); 
    char[] otp = new char[4]; 
    for (int i = 0; i <4; i++) 
    { 
        otp[i]=numbers.charAt(rndm_method.nextInt(numbers.length())); 
        x=x+otp[i];
    } 

    return x; 
}//this is the function for the random number generator for otp
 public void sms(String otp)
{
        try {

        String apiKey = "api key on msg91.com";
        String message = otp;
        String sender = "TESTIN";
        String numbers = num;
                    String a="http://api.msg91.com/api/sendhttp.php? 
          country=91&sender="+ sender +"&route=4&mobiles=" + numbers +"&authkey=api 
           key on msg91.com&message="+message+" ";
                    //System.out.println(a);
                    // Send data
        HttpURLConnection conn = (HttpURLConnection) new URL(a).openConnection();
        String data = apiKey + numbers + message + sender;
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Length", Integer.toString(data.length()));
        conn.getOutputStream().write(data.getBytes("UTF-8"));
        final BufferedReader rd = new BufferedReader(new 
         InputStreamReader(conn.getInputStream()));
        final StringBuffer stringBuffer = new StringBuffer();
        String line;
        while ((line = rd.readLine()) != null) {
            //stringBuffer.append(line);
                        //JOptionPane.showMessageDialog(null, "message"+line);
                        System.out.println("OTP SENT !");
        }
        rd.close();

        //return stringBuffer.toString();
    } catch (Exception e) {
                JOptionPane.showMessageDialog(null,e);

    }

}
//now you have to call this function and send your number as the parameter
 public Start() {
    this.setUndecorated(true);

    initComponents();

    jPasswordField1.setBackground(new Color(0, 0, 0, 0));

    jPasswordField1.setOpaque(false);  
    //jPasswordField1.setBorder(null); 
    this.setBounds(300, 200, 707, 390);
    SMS otp=new SMS("your number");
    x=otp.otpGenerator();
    otp.sms(x); 
    }
0
Shivam Rajput