2011-06-12 92 views
6

去年,我在C#中编写了一次性密码(OTP)生成器。现在我需要在Java中使用OTP生成器,但我无法在Java中找到等效的函数。代码的一次性密码(OTP)C#到Java转换

这是我去年写的代码:(我知道这OTP的安全性低,但我并不需要一个防弹一个)

SHA1CryptoServiceProvider hash = new SHA1CryptoServiceProvider(); //first hash with sha1 
byte[] hashPass = hash.ComputeHash(Encoding.ASCII.GetBytes(pass)); //pass is entered by user 
HMACMD5 hma = new HMACMD5(hashPass); // use the hashed value as a key to hmac 
OTPass = hma.ComputeHash(Encoding.ASCII.GetBytes(email + Counter(email)));// generate OTPass, Counter(email) is the counter of the user taken from database 
increaseCounter(email); // updating the counter 
this.SetLog(this.GetLog() + Environment.NewLine + "OTPass Generated: " + BitConverter.ToString(OTPass)); // OTP 

这里是Java代码中,我试图转换C#成:(这只是SHA1的一部分,我找不到怎么写HMAC-MD5在Java中)

import java.io.*; 
import java.security.*; 

public class otp { 

/** 
* @param args 
* @throws IOException 
*/ 
public static void main(String[] args) throws IOException { 

    System.out.println("Please enter your username:"); 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    String username = br.readLine(); 
    System.out.println("Please enter your password:"); 
    String password = br.readLine(); 

    try { 
     MessageDigest md = MessageDigest.getInstance("SHA1"); 

     String input = password; 
     md.update(input.getBytes()); 
     byte[] output = md.digest(); 
     System.out.println(); 
     System.out.println("SHA1(\""+input+"\") ="); 
     System.out.println(" "+bytesToHex(output)); 


     } catch (Exception e) { 
     System.out.println("Exception: "+e); 
     } 
    } 
    public static String bytesToHex(byte[] b) { 
     char hexDigit[] = {'0', '1', '2', '3', '4', '5', '6', '7', 
         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; 
     StringBuffer buf = new StringBuffer(); 
     for (int j=0; j<b.length; j++) { 
     buf.append(hexDigit[(b[j] >> 4) & 0x0f]); 
     buf.append(hexDigit[b[j] & 0x0f]); 
     } 
     return buf.toString();   
} 
} 

感谢您的帮助

+3

对于那些不知道是谁, OTP是“一次性密码”的缩写。 (只是想为维基百科节省带宽:-)。) – 2011-06-12 14:10:48

回答