我正在尝试开发新版本的Unicenta _这是一个Openbravo开放源码项目__在android平台上工作,我几乎完成了,但密码部分仍然有一些问题。
我的问题是: Unicenta使用Sha1加密将密码保存在mysql数据库中,所以当我尝试在我的安卓应用程序中进行同样的加密时,它并没有给我相同的密码加密,然后我做了什么;我查找Unicenta代码源代码,我拿起加密代码并将其放在我的应用程序中;
来自独角形代码源的加密函数:
public static String hashString(String sPassword) {
if (sPassword == null || sPassword.equals("")) {
return "empty:";
} else {
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(sPassword.getBytes("UTF-8"));
byte[] res = md.digest();
return "sha1:" + StringUtils.byte2hex(res);
} catch (NoSuchAlgorithmException e) {
return "plain:" + sPassword;
} catch (UnsupportedEncodingException e) {
return "plain:" + sPassword;
}
}
}所以很明显,这个函数接受一个字符串作为参数(密码)并返回(加密的密码)
但问题是,当我试图用独角形opos加密密码(0000)时,它会把我挖出来:(sha1:39dfa55283318d31afe5a3ff4a0e3253e2045e43)和我的安卓应用程序使用独角塔使用的相同方法,它又给我带来了另一个哈希(sha1:39dfa55283318d31afe5a3ff4a0e3253e2045e43)。
抱歉太久了,我希望如果有人高兴的话!
谢谢你
发布于 2016-07-02 13:48:41
Unicenta不直接加密/散列密码。看看byte2hex和JEditorText.java是如何在加密之前操纵输入密码的。因此,9802被转换为'Wt a‘没有引号,然后哈希。
第一个函数到散列:
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(sPassword.getBytes("UTF-8"));
byte[] res = md.digest();
return "sha1:" + StringUtils.byte2hex(res);byte2hex
StringUtils.java
public static String byte2hex(byte[] binput) {
StringBuilder sb = new StringBuilder(binput.length * 2);
for (int i = 0; i < binput.length; i++) {
int high = ((binput[i] & 0xF0) >> 4);
int low = (binput[i] & 0x0F);
sb.append(hexchars[high]);
sb.append(hexchars[low]);
}
//sb : 56E048B73E9B3EFF42C509B772AF6941FF0B5BA5
return sb.toString();
} 终于研究了JEditorText.java:
private static final char[] CHAR_abc1_1 = {'.', '?', '!', ',', '1', ';', ':'};
private static final char[] CHAR_abc1_2 = {'a', 'b', 'c', '2', '\u00a0'};
private static final char[] CHAR_abc1_3 = {'d', 'e', 'f', '3', '\u201a'};
private static final char[] CHAR_abc1_4 = {'g', 'h', 'i', '4', '\u00a1'};
private static final char[] CHAR_abc1_5 = {'j', 'k', 'l', '5'};
private static final char[] CHAR_abc1_6 = {'m', 'n', 'o', '6', '\u00a4', '\u00a2'};
private static final char[] CHAR_abc1_7 = {'p', 'q', 'r', 's', '7'};
private static final char[] CHAR_abc1_8 = {'t', 'u', 'v', '8', '\u00a3', '\ufffd'};
private static final char[] CHAR_abc1_9 = {'w', 'x', 'y', 'z', '9'};
private static final char[] CHAR_abc1_0 = {' ', '0'};
private static final char[] CHAR_ABC1_1 = {'.', '?', '!', ',', '1', ';', ':'};
private static final char[] CHAR_ABC1_2 = {'A', 'B', 'C', '2', '\u00b5'};
private static final char[] CHAR_ABC1_3 = {'D', 'E', 'F', '3', '\u00c9'};
private static final char[] CHAR_ABC1_4 = {'G', 'H', 'I', '4', '\u00cd'};
private static final char[] CHAR_ABC1_5 = {'J', 'K', 'L', '5'};
private static final char[] CHAR_ABC1_6 = {'M', 'N', 'O', '6', '\u00d1', '\u00d3'};
private static final char[] CHAR_ABC1_7 = {'P', 'Q', 'R', 'S', '7'};
private static final char[] CHAR_ABC1_8 = {'T', 'U', 'V', '8', '\u00da', '\u00dc'};
private static final char[] CHAR_ABC1_9 = {'W', 'X', 'Y', 'Z', '9'};
private static final char[] CHAR_ABC1_0 = {' ', '0'};发布于 2013-09-11 11:49:56
试试这个可能对你有帮助。
private String hashString(String s) {
try {
// Create SHA-1 Hash
MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
digest.update(s.getBytes("UTF-8"));
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < messageDigest.length; i++)
hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}https://stackoverflow.com/questions/18740064
复制相似问题