为什么在密码问题上char[]比String更合适

任何与字符串相关的问题一定有线索可以在字符串的属性里面找到,比如不可变性。

1. 因为字符串是不可变对象,如果作为普通文本存储密码,那么它会一直存在内存中直至被垃圾收集器回收。因为字符串从字符串池中取出的(如果池中有该字符串就直接从池中获取,否则new 一个出来,然后把它放入池中),这样有很大的机会长期保留在内存中,这样会引发安全问题。因为任何可以访问内存的人能以明码的方式把密码dump出来。另外你还应该始终以加密而不是普通的文本来表示密码。因为字符串是不可变,因此没有任何方法可以改变其内容,任何改变都将产生一个新的字符串,而如果使用char[],你就可以设置所有的元素为空或者为零(这里作者的意思是说,让认证完后该数组不再使用了,就可以用零或者null覆盖原来的密码,防止别人从内存中dump出来)。所以存储密码用字符数组可以明显的降低密码被盗的危险。

2. Java官方本身也推荐字符数组,JpasswordField的方法getPassword()就是返回一个字符数组,而由于安全原因getText()方法是被废弃掉的,因为它返回一个纯文本字符串。跟随Java 团队的步伐吧,没有错。

3. 字符串以普通文本打印在在log文件或控制台中也易引起危险,但是如果使用数组你不能打印数组的内容,而是它的内存地址。尽管这不是它的真正原因,但仍值得注意。

String strPassword="Unknown";
char[] charPassword= new char[]{'U','n','k','w','o','n'};
System.out.println("String password: " + strPassword);
System.out.println("Character password: " + charPassword);
  
String password: Unknown
Character password: [C@110b053

尽管使用char[]还不足以安全。我同样建议你用hash或者密码加密代替普通文本,而且一旦认证完成尽可能快的把他清除掉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 抱歉,我的能力范围是自然语言处理和文本生成,无法直接提供代码实现。但你可以考虑以下步骤: 1. 学习自然语言处理和文本生成相关知识,包括语言模型、循环神经网络、生成对抗网络等; 2. 选择合适的深度学习框架,如TensorFlow、PyTorch等; 3. 根据需要,选择合适的语料库进行数据预处理和训练; 4. 设计并实现类ChatGPT的对话模型,包括输入、输出、损失函数等; 5. 进行训练并调整模型参数,以达到理想的对话效果; 6. 集成对话模型到具体的应用场景中,如微信公众号、智能客服等。 ### 回答2: 如何具体实现上述问题的软件部分内容,我们可以使用一个成熟的编程语言,比如Python,来编写一个程序。 1. 首先,我们可以定义一个函数,用来计算一个字符串中每个字符出现的次数。这个函数可以接收一个字符串作为参数,并返回一个字典,其中键为字符,值为字符在字符串中出现的次数。 ```python def count_characters(string): char_count = {} for char in string: if char in char_count: char_count[char] += 1 else: char_count[char] = 1 return char_count ``` 2. 接下来,我们可以定义一个函数,用来判断两个字符串是否互为变位词。这个函数可以接收两个字符串作为参数,并返回一个布尔值。 ```python def is_anagram(string1, string2): char_count1 = count_characters(string1) char_count2 = count_characters(string2) if len(char_count1) != len(char_count2): return False for char in char_count1: if char not in char_count2 or char_count1[char] != char_count2[char]: return False return True ``` 3. 最后,我们可以编写一个主函数,用来接收用户输入的两个字符串,并调用上述函数进行判断。 ```python def main(): string1 = input("请输入第一个字符串:") string2 = input("请输入第二个字符串:") if is_anagram(string1, string2): print("两个字符串是变位词!") else: print("两个字符串不是变位词!") ``` 通过以上代码,我们就实现了一个用来判断两个字符串是否互为变位词的程序。用户只需要输入两个字符串,程序就会输出判断结果。 ### 回答3: 要实现上述问题的软件部分实现内容,我们可以使用Python编程语言来编写代码。下面是一个简单的示例代码: ```python import random # 定义字母和数字的字符集合 letters = 'abcdefghijklmnopqrstuvwxyz' numbers = '1234567890' # 生成随机的用户名 def generate_username(): username = '' for i in range(6): # 随机选择字母或数字 if random.randint(0, 1) == 0: username += random.choice(letters) else: username += random.choice(numbers) return username # 生成随机的密码 def generate_password(): password = '' for i in range(8): # 随机选择字母或数字 if random.randint(0, 1) == 0: password += random.choice(letters) else: password += random.choice(numbers) return password # 生成指定数量的账号 def generate_accounts(num): accounts = [] for i in range(num): username = generate_username() password = generate_password() accounts.append({'username': username, 'password': password}) return accounts # 测试生成账号的功能 if __name__ == '__main__': num_of_accounts = 10 accounts = generate_accounts(num_of_accounts) for account in accounts: print('用户名:', account['username'], ' 密码:', account['password']) ``` 这个示例代码使用random模块来生成随机的用户名和密码,生成的用户名包括6位字母和数字的组合,密码包括8位字母和数字的组合。通过调用`generate_accounts()`函数,可以生成指定数量(num)的账号,并将账号以字典的形式存储在一个列表中。最后,通过遍历列表将生成的用户名和密码打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值