base64_encode() 从 php 函数到 Java 没有 return 相同的数据
base64_encode() from php function to Java does not return same data
我正在开展一个 java 项目,该项目需要通过在本地网站上创建的帐户进行身份验证。这些帐户的密码在插入数据库之前由 php 函数加密:
public function crypter($mdp){
$j = 0;
$tmp = 0;
$key = $mdp;
$res = "";
for($i = 0; $i < strlen($mdp) ; $i++)
{
$tmp = ord($mdp[$i]) + ord($key[$i]);
if($tmp > 255){
$tmp = $tmp - 256;
}
$res[$i] = chr($tmp);
if($j == strlen($key)-1){
$j = 0;
}
else{
$j = (($j % (strlen($key))) +1 );
}
}
$res = base64_encode($res);
return $res;
}
注意:这个函数不是我写的,所以如果你们知道 $j
变量的用途,请告诉我。我也(显然)无法更改此代码。
所以我尝试在 Java 中翻译该函数,结果是:
public String cryptMdp(String mdp){
String res = "";
String key = mdp;
int j = 0;
int tmp = 0;
for (int i = 0; i < mdp.length(); i++) {
char c = mdp.charAt(i);
char c2 = key.charAt(i);
tmp = (int) c + (int) c2;
if (tmp > 255) {
tmp = tmp - 256;
}
res += (char) tmp;
if (j == key.length() - 1){
j = 0;
}
else{
j = (j % key.length()) + 1;
}
}
return Base64.getMimeEncoder().encodeToString(res.getBytes());
}
不幸的是,那些 return 不是相同的字符串(例如:对于字符串 a
、php returns wg==
和 Java returns w4I=
), 尽管根据 this question 这应该是一个标准。
你们能看出我做错了什么吗?
使用 Base64 的现有 Java 功能:
https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html
您可能正在寻找这种方法:
编码(字节[] src)
使用 Base64 编码方案将指定字节数组中的所有字节编码为新分配的字节数组。
我已经能够使用 URLConnection 向我的 PHP 页面发送 HTTP 请求来做我想做的事情,就像这样:
public String cryptMdp(String mdp){
try {
URL url = new URL("http://myaddress/someproject/create_pwd.php?pwd=" + mdp);
URLConnection conn = url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputline = "";
while((inputline = in.readLine()) != null){
return inputline;
}
in.close();
} catch (MalformedURLException ex) {
System.out.println("error URL");
} catch (IOException ex) {
System.out.println("error connection");
}
return null;
}
问题是 PHP 在对它们进行编码之前使用了未知字符,这意味着所有密码都被错误地加密了...
编辑:
实际上,密码在 IDE (Netbeans) 和构建的应用程序 (.jar) 中的加密方式不同,因此 Base64.getMimeEncoder().encodeToString(res.getBytes());
实际上产生与 PHP 方法相同的结果。 ..
我正在开展一个 java 项目,该项目需要通过在本地网站上创建的帐户进行身份验证。这些帐户的密码在插入数据库之前由 php 函数加密:
public function crypter($mdp){
$j = 0;
$tmp = 0;
$key = $mdp;
$res = "";
for($i = 0; $i < strlen($mdp) ; $i++)
{
$tmp = ord($mdp[$i]) + ord($key[$i]);
if($tmp > 255){
$tmp = $tmp - 256;
}
$res[$i] = chr($tmp);
if($j == strlen($key)-1){
$j = 0;
}
else{
$j = (($j % (strlen($key))) +1 );
}
}
$res = base64_encode($res);
return $res;
}
注意:这个函数不是我写的,所以如果你们知道 $j
变量的用途,请告诉我。我也(显然)无法更改此代码。
所以我尝试在 Java 中翻译该函数,结果是:
public String cryptMdp(String mdp){
String res = "";
String key = mdp;
int j = 0;
int tmp = 0;
for (int i = 0; i < mdp.length(); i++) {
char c = mdp.charAt(i);
char c2 = key.charAt(i);
tmp = (int) c + (int) c2;
if (tmp > 255) {
tmp = tmp - 256;
}
res += (char) tmp;
if (j == key.length() - 1){
j = 0;
}
else{
j = (j % key.length()) + 1;
}
}
return Base64.getMimeEncoder().encodeToString(res.getBytes());
}
不幸的是,那些 return 不是相同的字符串(例如:对于字符串 a
、php returns wg==
和 Java returns w4I=
), 尽管根据 this question 这应该是一个标准。
你们能看出我做错了什么吗?
使用 Base64 的现有 Java 功能: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html
您可能正在寻找这种方法:
编码(字节[] src) 使用 Base64 编码方案将指定字节数组中的所有字节编码为新分配的字节数组。
我已经能够使用 URLConnection 向我的 PHP 页面发送 HTTP 请求来做我想做的事情,就像这样:
public String cryptMdp(String mdp){
try {
URL url = new URL("http://myaddress/someproject/create_pwd.php?pwd=" + mdp);
URLConnection conn = url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputline = "";
while((inputline = in.readLine()) != null){
return inputline;
}
in.close();
} catch (MalformedURLException ex) {
System.out.println("error URL");
} catch (IOException ex) {
System.out.println("error connection");
}
return null;
}
问题是 PHP 在对它们进行编码之前使用了未知字符,这意味着所有密码都被错误地加密了...
编辑:
实际上,密码在 IDE (Netbeans) 和构建的应用程序 (.jar) 中的加密方式不同,因此 Base64.getMimeEncoder().encodeToString(res.getBytes());
实际上产生与 PHP 方法相同的结果。 ..