Java 如何加密字符串,然后解密它们
我正在尝试对我的游戏实施加密系统,以保护玩家的密码和其他游戏数据 我想出了一个小测试来适应这一切的逻辑 我只是想知道解决这个问题的最好方法,我读java,搜索我需要的逻辑(并找到一种编写它的方法),这是相当不错的。这么说来,我并不是在寻找一些完全适合我的游戏的片段。我只是在寻找比我所拥有的更好的逻辑 这只适用于4个字符 这是我目前所知道的Java 如何加密字符串,然后解密它们,java,encryption,Java,Encryption,我正在尝试对我的游戏实施加密系统,以保护玩家的密码和其他游戏数据 我想出了一个小测试来适应这一切的逻辑 我只是想知道解决这个问题的最好方法,我读java,搜索我需要的逻辑(并找到一种编写它的方法),这是相当不错的。这么说来,我并不是在寻找一些完全适合我的游戏的片段。我只是在寻找比我所拥有的更好的逻辑 这只适用于4个字符 这是我目前所知道的 import java.util.Random; 公共类编码解码{ 私有字符串stringToHash; 私有布尔运行=false; 私有字符串origina
import java.util.Random;
公共类编码解码{
私有字符串stringToHash;
私有布尔运行=false;
私有字符串originalString;
私有字符串编码字符串;
私有布尔解码=假;
公共编码和解码(){
init();
}
public void init(){
运行=真;
编码字符串(“abcd”);
System.out.println(“原始字符串:“+originalString”);
延迟();
解码字符串();
}
私有字符串(String sth){
字符串[]子字符串=新字符串[25];
原始字符串=某物;
for(int-subStr=0;subStr
}
下面是一个输出示例
现在是1386秒
尝试#339016:bsev
现在是1386秒
尝试#339017:qycu
现在是1386秒
解码用户名成功
用了23分钟,339018试图将vlbc解码回abcd。回答:不要自己实施加密。 Java语言中已经有许多标准加密算法可用。一些流行的算法是RSA(非对称)和AES(对称) 查看
如果要存储密码,应使用一些散列算法存储密码,如SHA-256,甚至更好的SHA-512。此外,在散列之前添加一些安全的盐会使攻击者更加困难。询问“最佳方法”的问题显然是自以为是的。通常没有最好的办法。即使您将问题改为询问几种好的方法,也可能过于宽泛。密码保护的典型方法是:不存储密码,而是(例如SHA-1)用户的密码,并仅存储该密码。如果用户再次登录,只需比较散列码即可。保护密码在这里以及安全堆栈交换中已经讨论过很多次。在发布前阅读这些内容。了解salt、hash、bcrypt等。感谢nabin bhandari,我将研究RSA,因为我听说它被用于我的游戏类型。不客气。祝你好运投票结果是向上的,但我担心推荐过时的散列函数,如MD5或SHA1。看见您能更新您的答案以反映这一点吗?@rkosegi感谢您的建议。答案已编辑。啊哈好的,我看到ima研究了SHA-256 hasing,这是一个离题的话题,但比特币是否使用SHA-512,或者它是否实现了两次SHA-256(或者是同一件事?)只是好奇而已。
import java.util.Random;
public class EncodingThenDecoding {
private String stringToHash;
private boolean running = false;
private String originalString;
private String encodedString;
private boolean decoding = false;
public EncodingThenDecoding() {
init();
}
public void initInit() {
running = true;
encodeString("abcd");
System.out.println("Original String: " + originalString);
delay();
decodeStrings();
}
private void encodeString(String sth) {
String[] subStrings = new String[25];
originalString = sth;
for(int subStr = 0;subStr < sth.length();subStr++ ) {
subStrings[subStr] = sth.substring(subStr);
}
for(int i = 0;i < sth.length();i++) {
Random ran = new Random();
StringBuilder encoder = new StringBuilder();
encoder.append( (char)('a' + ran.nextInt('z'-'a')));
subStrings[i] = encoder.toString();
//System.out.println(subStrings[i]);
}
sth = subStrings[0] + subStrings[1] + subStrings[2] + subStrings[3];
encodedString = sth;
System.out.println(sth);
delay();
}
private void decodeString() {
int tries = 0;
int ii = 0;
running = true;
long sd = System.nanoTime();
long minutes = 0;
while(running) {
tries++;
String strToDecode = encodedString;
String[] usedDecodedStrings = new String[1000000];
String[] decodedSubStrings = new String[25];
String decodedString = null;
//store hashed string's chars into an array.
for(int i = 0; i < strToDecode.length();i++) {
decodedSubStrings[i] = strToDecode.substring(i);
}
//stores a random letter between z-a and replaces the array items above.
for(int i = 0;i < decodedSubStrings.length;i++) {
Random ran = new Random();
StringBuilder encoder = new StringBuilder();
encoder.append( (char)('a' + ran.nextInt('z'-'a')));
decodedSubStrings[i] = encoder.toString();
}
//stores the string containing all the new characters assigned above,
decodedString = decodedSubStrings[0] + decodedSubStrings[1] + decodedSubStrings[2] + decodedSubStrings[3];
long nanoseconds = System.nanoTime() - sd;
long miliseconds = nanoseconds/1000000;
long seconds = miliseconds/1000;
System.out.println("its been " + seconds + " seconds");
if(decodedString.equalsIgnoreCase(originalString)) {
System.out.println("Decoding username was succesful!");
System.out.println("it took " + seconds/60 + " minutes and " + tries + " tries to Decode " + strToDecode + " back into " + originalString);
return;
}
else if(!decodedString.equalsIgnoreCase(originalString)) {
System.out.println("Attempt #" + tries + ": " + decodedString);
}
}
}
public void delay() {
try {
Thread.sleep(3000);
}
catch(InterruptedException e) {
}
}
public static void main(String[] args) {
EncodingThenDecoding encryptThenDecrypt = new EncodingThenDecoding();
}