2009-09-06 70 views
1

我在Java中有这个算法来存储数据库中的密码。我想在Ruby on Rails中重写我的应用程序,所以我需要使用相同的算法来比较散列密码。这个算法的Ruby等价物是什么?如何将Java中的SHA函数转换为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

在阅读本文之前,请阅读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 =

+0

我用Base64.b64encode Digest :: SHA1.digest('my password')得到一个“\ n”: =>“ovj3 + hlaCAoipokEHaqPIET58zY = \ n” – 2009-09-06 23:56:05

+1

这是严重的问题吗?这不像\ n是一个有效的Base64字符;你可以去掉它,是吗? – 2009-09-07 01:52:12

+0

require'digest/sha1' require'base64' Base64.b64encode(Digest :: SHA1.digest('my password'))。chomp – Anko 2009-09-07 02:19:44

1

你去任何前进一步,停止你正在做什么,阅读编码恐怖文章:You're Probably Storing Passwords Incorrectly

使用简单散列(不含salt)对密码进行编码几乎与根本不使用任何散列一样糟糕。

+0

你是对的!这是4年前的错误。但是我无法从数据库中恢复已经存储的密码,我可以吗?我将添加一个盐,但我仍然需要知道如何在Ruby中完成它。 – 2009-09-06 23:39:27

+0

够公平的,我担心这可能是遗留系统问题。一般来说,除了使用彩虹表攻击(很多工作几乎没有什么好处),你不能直接恢复已经存储的密码。一种方法可能是向用户展示:“嗨!您的密码已过期,请在继续之前更新您的密码。”并将当前的密码编码机制存储在您的数据库中(这样您就知道谁更新了,谁没有更新)。 – 2009-09-06 23:54:13

+1

另一种选择是将已经哈希的密码重新加密,如下所示:new_hash(old_hash(password),salt) - 并存储所有像这样的密码 – 2009-09-06 23:58:26