【发布时间】:2016-12-17 16:49:41
【问题描述】:
我正在尝试将 PHP 中的这段代码转换为 Java,但我得到了不同的结果,错误在哪里?
PHP 代码
public function hashSSHA($password) {
$salt = sha1(rand());
$salt = substr($salt, 0, 10);
$salt = "172ba59e6b";
$encrypted = base64_encode(sha1($password . $salt, true) . $salt);
$hash = array("salt" => $salt, "encrypted" => $encrypted);
return $hash;
}
Java
private Map senha(String password){
Map<String, String> pass = new HashMap<String, String>();
String salt = sha1(Integer.toString((int) Math.random()));
salt = salt.substring(0,10).toLowerCase();
salt = "172ba59e6b";
String tobase64 = toSHA1((password + salt).getBytes()) + salt;
byte[] encodedBytes = Base64.encodeBase64(tobase64.getBytes());
String encrypted = new String(encodedBytes);
String[] array;
pass.put("salt",salt);
pass.put("encrypted",encrypted);
Log.d("asd",encrypted);
return pass;
}
Java sha1 函数
public String sha1(String s) {
try {
// Create MD5 Hash
MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
digest.update(s.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < messageDigest.length; i++)
hexString.append(String.format("%02X", 0xFF & messageDigest[i]));
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
Java sha1bin
public static String toSHA1(byte[] convertme) {
MessageDigest md = null;
try {
md = MessageDigest.getInstance("SHA-1");
}
catch(NoSuchAlgorithmException e) {
e.printStackTrace();
}
return new String(md.digest(convertme));
}
我哪里错了?有什么简单的方法吗?
在使用 salt=172ba59e6b 的 java 上:
String tobase64 = toSHA1(("muranga21" + salt).getBytes()) + salt;
返回:��{��b�v����r���t�172ba59e6b
在盐=172ba59e6b 的 PHP 上:
$sha1 = sha1("muranga21" . $salt, true) . $salt;
返回:��{��b�v����r���t�172ba59e6b
但是当我尝试做base64编码时:
在 php 上我得到了:
o/exe6eNHGKbdvy6jd1ym6uddKExNzJiYTU5ZTZi
在java上:
77+977+9e++/ve+/vRxi77+9du+/ve+/vXLvv73vv73vv71077+9MTcyYmE1OWU2Yg==
【问题讨论】:
-
安全漏洞: 从不使用
String类型来保存密码(例如您的senha和sha1方法)。请改用byte数组(即byte[])并确保在丢弃引用之前覆盖其内容。 -
不要创建自己的密码哈希函数。使用 PHP 的密码哈希 API! php.net/password
标签: java php password-encryption