2014-12-04 72 views
0

我正在传递字符串格式的密码(在我的应用程序和后端之间),如密码。 后来我意识到密码可以很容易地从堆内存转储中读取,因为它以文本格式存储。char数组Vs字节数组使用哪一个?

String password = "super_password"; 

所以我决定用字符数组,

Char[] passChar = password.toCharArray(); 

,但我很担心,密码仍然可以从内存转储逐个字符阅读。然后我想用字节数组代替。

byte[] passByte = password.getBytes(); 

我的问题:使用字节数组来传递密码等敏感信息是否安全? 或任何人都可以推荐任何安全?

+1

如果它仍然可以通过字符读取char,那么通过逐字节读取它并将其手动转换回来,停止该操作的人是什么? – Pokechu22 2014-12-04 01:00:26

+0

@ Pokechu22我相信他是引用[this](http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords)。 – August 2014-12-04 01:08:22

回答

1

可能是您可以通过MD5或其他加密方式加密密码。

package test.md5; 

import java.security.MessageDigest; 

public class MD5Util { 
    public final static String MD5(String s) { 
     char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};  

     try { 
      byte[] btInput = s.getBytes(); 
      // get MD5 MessageDigest obj 
      MessageDigest mdInst = MessageDigest.getInstance("MD5"); 
      // update 
      mdInst.update(btInput); 
      // get encryption string 
      byte[] md = mdInst.digest(); 
      // change to hexadecimal 
      int j = md.length; 
      char str[] = new char[j * 2]; 
      int k = 0; 
      for (int i = 0; i < j; i++) { 
       byte byte0 = md[i]; 
       str[k++] = hexDigits[byte0 >>> 4 & 0xf]; 
       str[k++] = hexDigits[byte0 & 0xf]; 
      } 
      return new String(str); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    public static void main(String[] args) { 
     System.out.println(MD5Util.MD5("20121221")); 
     System.out.println(MD5Util.MD5("encrypt")); 
    } 
} 
+1

md5不加密。 – Khanna111 2014-12-04 05:37:51

+0

my englishi很差~~对不起 – TraXD 2014-12-04 10:24:31

0

我假设这个问题主要涉及从一个进程一台主机上的密码传送到另一个进程另一台主机上,但将覆盖在密码特定变量读取为好。

分配问题并不局限于仅将密码分配给String实例,该实例遇到其他SF答案(如this)中已详细说明的问题。我会补充说,你使用的char或byte数组不在全局上下文中,但在本地方法上下文中,以便它在退出方法后快速超出范围,从而使其可用于GC。如果变量是年轻一代,那么一旦它超出了范围,就需要多个GC循环来清除它。 Plus char/byte []是可变的,所以它也可以被清除。但是,这次仍然有机会从堆转储中恢复密码。

简而言之:

  1. 从来没有坚持在后端明文密码。 [用盐搅拌。详细here。]
  2. 千万不要在非安全介质上以明文形式传输密码。 [在主机间使用TLS]
+0

谢谢,这个信息有帮助 – 2014-12-04 01:55:33

+0

@Lucky_Singh:如果这个信息有帮助,那么请通过接受和/或upvoting来帮助我增加我的声望。 – Khanna111 2014-12-04 07:56:13

1

Java中面向密码的API使用char[]。例如,ConsoleJPasswordField返回来自密码输入的字符数组,并且PBEKeyKeyStore要求char[]用于基于密码的加密。

byte[]char[]之间的转换会在堆中创建更多的敏感数据副本,并且可能很难确保字符编码器从其内部缓冲区中删除所有密码数据。

使用char[]存储密码,并且write '\0' to the array只要密码不再需要,

+0

感谢队友,我使用后重写字符数组。 – 2014-12-04 01:55:00