如何将Java中的SHA函数转换为Ruby中的等效函数?

时间:2009-09-06 23:18:29

标签: java ruby sha1 encryption

我在Java中使用此算法将密码存储在数据库中。我想在Ruby on Rails中重写我的应用程序,所以我需要相同的算法来比较散列密码。什么是这个算法的Ruby等价物?

public static String encrypt(String password) {
    MessageDigest md;
    try {
        md = MessageDigest.getInstance("SHA");
        md.update(password.getBytes("UTF-8")); // step 3
        byte raw[] = md.digest(); // step 4
        String hash = (new BASE64Encoder()).encode(raw); // step 5
        return hash; // step 6
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    return null;
}

仅出于测试目的,“teste123”密码在我的Java版本中生成此哈希: PQ87ndys7DDEAIxeAw5sE6R4y08 =

2 个答案:

答案 0 :(得分:2)

在你进一步任何之前,停止你正在做的事情并阅读这篇Coding Horror文章:You're Probably Storing Passwords Incorrectly

使用没有盐的普通哈希来编码密码几乎与不使用任何哈希一样糟糕。

答案 1 :(得分:2)

在阅读本文之前,请阅读Greg's answer关于散列的内容。

然后:

import java.security.*;
import sun.misc.BASE64Encoder;
import java.io.*;
public class test {
  public static String encrypt(String password) {
    MessageDigest md;
    try {
      md = MessageDigest.getInstance("SHA");
      md.update(password.getBytes("UTF-8")); // step 3
      byte raw[] = md.digest(); // step 4
      String hash = (new BASE64Encoder()).encode(raw); // step 5
      return hash; // step 6
    } catch (NoSuchAlgorithmException e) {
    } catch (java.io.UnsupportedEncodingException e) {
    }
    return null;
  }

  public static void main(String[] args) {
    System.out.println(encrypt("my password"));
  }
}

此输出

  

ovj3 + hlaCAoipokEHaqPIET58zY =

在Ruby中:

require 'digest/sha1'
require 'base64'
Base64.b64encode Digest::SHA1.digest('my password')

还输出

  

ovj3 + hlaCAoipokEHaqPIET58zY =