2013-08-20 32 views
3

大家好我正在開發我的遊戲的服務器和客戶端之間的第一個通信。很顯然,由於我從零開始,我正在仔細地預測程序的各個部分。使用JPasswordField及其getText/getPassword方法

我在看Swing API,發現JPasswordField是一個普通的InputField,但是用於密碼。

如果調用不推薦使用的方法getText()或者如果調用getPassword,則返回字符串數據。

在看了那麼我明白這不是一個好主意,使用gettext,也不是像

String password = String.valueOf(passwordField.getPassword()); 

,因爲這樣做我創建一個字符串,可以留在記憶的很長一段時間。

我試圖創造的東西,可以轉換密碼,而無需使用字符串和我創造了這個:

public static String digest(char[] in) throws NoSuchAlgorithmException { 

    MessageDigest md = MessageDigest.getInstance("SHA-256"); 

    ArrayList<Byte> list = new ArrayList<Byte>(); 
    for(int i = 0; i<in.length; i++){ 
     String ch = String.valueOf(in[i]); 
     byte[] b = ch.getBytes(); 
     for(int j = 0; j<b.length;j++){ 
      list.add(b[j]); 
     } 
    } 
    byte[] inputInByte = new byte[list.size()]; 
    for(int i =0;i<list.size();i++){ 
     inputInByte[i] = list.get(i); 
    } 
    md.update(inputInByte); 

    byte byteData[] = md.digest(); 

    StringBuffer hexString = new StringBuffer(); 
    for (int i = 0; i < byteData.length; i++) { 
     String hex = Integer.toHexString(0xff & byteData[i]); 
     if (hex.length() == 1) { 
      hexString.append('0'); 
     } 
     hexString.append(hex); 
    } 
    return hexString.toString(); 
} 

的問題是:是這樣的算法正確和良好的密碼的安全性?我不得不使用一個字符串從char轉換爲字節。

此外,我還返回一個哈希的字符串,是否有任何問題呢?從散列開始找到密碼應該相當困難;)

數據庫連接如何? Hsqldb允許我創建查詢,但每個查詢都是一個字符串......

回答

2

我覺得你的代碼是相當確定的,但你仍然字符串致力於打造字節值,所以你也許更好的變化String.valueOf(in[i]);到這樣的事情:

public static String digest(char[] in) throws NoSuchAlgorithmException { 

    MessageDigest md = MessageDigest.getInstance("SHA-256"); 

    ArrayList<Byte> list = new ArrayList<Byte>(); 
    for(int i = 0; i<in.length; i++){ 
     byte b = (byte) in[i] 
     list.add(b); 
    } 
    byte[] inputInByte = new byte[list.size()]; 
    for(int i =0;i<list.size();i++){ 
     inputInByte[i] = list.get(i); 
    } 
    md.update(inputInByte); 

    byte byteData[] = md.digest(); 

    StringBuffer hexString = new StringBuffer(); 
    for (int i = 0; i < byteData.length; i++) { 
     String hex = Integer.toHexString(0xff & byteData[i]); 
     if (hex.length() == 1) { 
      hexString.append('0'); 
     } 
     hexString.append(hex); 
    } 
    return hexString.toString(); 
} 

,這也是比使用,對週期和兩步轉換爲字節更加容易。

3

使用SHA-256摘要是一種散列方法,而不是一種加密方法。它就像一個指紋。你能否從他的指紋中得到一個人而不檢測每個人(60億)的指紋?例如,它用於在php中的數據庫中存儲密碼。我們只存儲pass的哈希值,當用戶想要連接時,我們計算新輸入的密碼哈希值,並將其與數據庫的哈希值進行比較。 這可以防止用戶在數據庫被黑掉時竊取密碼。但是你不能從哈希中獲得密碼。我希望我回答你的問題。 順便說一句,可以考慮使用消息阿帕奇LIB消化,更容易,更安全,我認爲

+0

我也想知道我用來計算散列的方法是否安全。 – Gianmarco