【问题标题】:Unicenta password encryptionUnicenta 密码加密
【发布时间】:2013-09-15 09:52:14
【问题描述】:

我正在尝试开发新版本的 Unicenta opos _ 它是一个 Openbravo 开源项目 _ 在 android 平台上工作,我几乎完成了,但我仍然有一些密码部分的问题。

我的问题是: Unicenta opos 使用 Sha1 加密将密码保存在 mysql 数据库中,所以当我尝试在我的 android 应用程序中执行相同操作时,它没有为我提供相同密码的相同加密,然后我做了什么;我查找了 Unicenta 代码源,然后我拿起了加密代码并将其放在我的应用程序中;

来自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;
          }
      }
    }

所以很明显,这个函数将字符串作为参数(密码)并返回(密码加密)

但问题是,当我尝试使用 unicenta opos 加密密码(例如(0000)时)它给了我:(sha1:B6589FC6AB0DC82CF12099D1C2D40AB994E8410C) 和我的 android 应用程序使用与 unicenta 相同的方法,它给了我另一个哈希 (sha1:39dfa55283318d31afe5a3ff4a0e3253e2045e43)

对不起,如果有人感兴趣,我希望!

谢谢你

【问题讨论】:

  • 如果您不加盐,请不要使用简单的哈希算法来存储密码特别是。检查 Unicenta opos 的散列输出是否一致(多次运行的散列相同),因为它可能会在散列之前对数据进行加盐处理。 '0000' 的“正确”纯 SHA-1 摘要确实是 '39dfa55283318d31afe5a3ff4a0e3253e2045e43'。

标签: java android encryption hash passwords


【解决方案1】:

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'};

【讨论】:

    【解决方案2】:

    试试这个可能对你有帮助

    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 "";
        }
    

    【讨论】:

    • 只是说...当您实际创建 SHA-1 哈希时,第 3 行的评论说“创建 MD5 哈希”。并且还使用 getBytes("UTF-8") 而不是平台特定的 getBytes() 没有参数。
    • 别担心,我是用这个方法创建 MD5,这会创建 SHA-1。
    • 感谢@BirajZalavadia,实际上您的方法与我在 unicenta 代码源中找到的方法相同,我试了一下,但它仍然没有给我“B6589FC6AB0DC82CF12099D1C2D40AB994E8410C”的密码“ 0000" :/
    • 我只是换了,现在可以了吗?工作还是不工作?
    • 真的,你确实得到了“0000”的“B6589FC6AB0DC82CF12099D1C2D40AB994E8410C”!! :o
    猜你喜欢
    • 2010-09-05
    • 2010-11-06
    • 2010-10-23
    相关资源
    最近更新 更多