当前位置:  开发笔记 > 编程语言 > 正文

有谁知道JDeveloper/SQL Developer使用哪种加密技术来保存凭据?

如何解决《有谁知道JDeveloper/SQLDeveloper使用哪种加密技术来保存凭据?》经验,为你挑选了6个好方法。

因为我需要实现类似的解决方案,所以我非常感兴趣的是要了解这里使用哪种技术来保存合理的数据.这是一个示例连接配置和生成的导出片段:

Oracle SQL Developer Connections http://i44.tinypic.com/2lcwpkg.gif


    
        
        
        
            
                username
            
            
                054D4844D8549C0DB78EE1A98FE4E085B8A484D20A81F7DCF8
            
        
        
    

任何建议都会非常感激.



1> Adam Paynter..:

对于好奇的人,你实际看到的是与加密密码连接的密钥.例如,我尝试使用以下方法加密密码"SAILBOAT":

DatabaseProviderHelper.goingOut("SAILBOAT")

在这个特定的例子中,结果是:

0527C290B40C41D71139B5E7A4446E94D7678359087249A463

第一个字节是常量:

05

接下来的8个字节表示随机生成的密钥(对于DES密码):

27C290B40C41D711

其余字节是加密密码:

39B5E7A4446E94D7678359087249A463

因此,要解密密码,您只需使用:

public static byte[] decryptPassword(byte[] result) throws GeneralSecurityException {
    byte constant = result[0];
    if (constant != 5) {
        throw new IllegalArgumentException();
    }

    byte[] secretKey = new byte[8];
    System.arraycopy(result, 1, secretKey, 0, 8);

    byte[] encryptedPassword = new byte[result.length - 9];
    System.arraycopy(result, 9, encryptedPassword, 0, encryptedPassword.length);

    byte[] iv = new byte[8];
    for (int i = 0; i < iv.length; i++) {
        iv[i] = 0;
    }

    Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKey, "DES"), new IvParameterSpec(iv));
    return cipher.doFinal(encryptedPassword);
}



2> Korny..:

请注意,Tim上面的密码哈希不适用于"apps_ro" - 可能是他剪切并粘贴在错误的地方......我不会发布真实密码,以防万一他不想共享!

我遇到了类似的问题,试图集中存储我的数据库凭据(对于非安全数据库!),然后导出sql developer xml文件.我不知道算法是什么 - 但是,你真的不需要知道算法,因为你可以自己调用Oracle java API.如果您有SQLDeveloper,只需获取正确的Jar文件:

cp /Applications/SQLDeveloper.App/Contents/Resources/sqldeveloper/BC4J/lib/db-ca.jar .
cp /Applications/SQLDeveloper.App/Contents/Resources/sqldeveloper/jlib/ojmisc.jar .

然后在Java应用程序中加载它们,或像我一样使用类似JRuby的东西:

$jirb
> require 'java'
> require 'ojmisc.jar'
> require 'db-ca.jar'
> Java::oracle.jdevimpl.db.adapter.DatabaseProviderHelper.goingOut("password")    
 => "059D45F5EB78C99875F6F6E3C3F66F71352B0EB4668D7DEBF8" 
> Java::oracle.jdevimpl.db.adapter.DatabaseProviderHelper.goingOut("password")
 => "055CBB58B69B477714239157A1F95FDDD6E5B453BEB69E5D49" 
> Java::oracle.jdevimpl.db.adapter.DatabaseProviderHelper.comingIn("059D45F5EB78C99875F6F6E3C3F66F71352B0EB4668D7DEBF8")
 => "password" 
> Java::oracle.jdevimpl.db.adapter.DatabaseProviderHelper.comingIn("055CBB58B69B477714239157A1F95FDDD6E5B453BEB69E5D49")
 => "password" 

请注意,算法,无论它是什么,都有一个随机因子,因此使用两次相同的密码可以生成两个不同的十六进制字符串.



3> Topera..:

这个解决方案对我很有用...复制自:http://www.mischiefblog.com/?p = 912

import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.*;

/**
 * Decrypt passwords stored in Oracle SQL Developer. This is intended for
 * password recovery.
 * 
 * Passwords are stored in
 * ~/.sqldeveloper/system2.1.1.64.39/o.jdeveloper.db.connection
 * .11.1.1.2.36.55.30/connections.xml
 */
public class Decrypt {
    public static byte[] decryptPassword(byte[] result)
            throws GeneralSecurityException {
        byte constant = result[0];
        if (constant != (byte) 5) {
            throw new IllegalArgumentException();
        }

        byte[] secretKey = new byte[8];
        System.arraycopy(result, 1, secretKey, 0, 8);

        byte[] encryptedPassword = new byte[result.length - 9];
        System.arraycopy(result, 9, encryptedPassword, 0,
                encryptedPassword.length);

        byte[] iv = new byte[8];
        for (int i = 0; i < iv.length; i++) {
            iv[i] = 0;
        }

        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKey, "DES"),
                new IvParameterSpec(iv));
        return cipher.doFinal(encryptedPassword);
    }

    public static void main(String[] args) {
        if (args.length != 1) {
            System.err.println("Usage:  java Decrypt ");
            System.exit(1);
        }

        if (args[0].length() % 2 != 0) {
            System.err
                    .println("Password must consist of hex pairs.  Length is odd (not even).");
            System.exit(2);
        }

        byte[] secret = new byte[args[0].length() / 2];
        for (int i = 0; i < args[0].length(); i += 2) {
            String pair = args[0].substring(i, i + 2);
            secret[i / 2] = (byte) (Integer.parseInt(pair, 16));
        }

        try {
            System.out.println(new String(decryptPassword(secret)));
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
            System.exit(3);
        }
    }
}


这不是我用'main`方法的答案吗?文章没有给予任何信任.:(

4> M-Razavi..:

鉴于解决方案太旧,只适用于版本2.x但现在不适用.因为Oracle SQL Developer在版本3.x和4.x中更改了加密算法.

版本3

密码以加密方式存储在以下位置的connections.xml文件中:

Windows: C:\Users\\AppData\Roaming\SQL Developer\system\o.jdeveloper.db.connection.\connections.xml
Linux: ~/.sqldeveloper/system/o.jdeveloper.db.connection./connections.xml

版本4

密码以前面提到的connections.xml文件加密存储,但加密密钥在product-preferences.xml文件中使用机器唯一值db.system.id,可在此处访问:

Windows: C:\Users\\AppData\Roaming\SQL Developer\system\o.sqldeveloper.\product-preferences.xml
Linux: ~/.sqldeveloper/system/o.sqldeveloper./product-preferences.xml

要解密最新的加密文件,您可以使用为SQL Developer 显示密码扩展名.或使用SQL Developer密码解密器解密文件



5> 小智..:

与kornelissietsma相同的代码已经给出了,但写在java上:

import oracle.jdevimpl.db.adapter.DatabaseProviderHelper;

class Decode {
    String pass = ""; 

    public Decode() {
        pass = DatabaseProviderHelper.comingIn("HASH");
        System.out.println(pass);
    }   

    public static void main(String[] args){
        new Decode();
    }   
}

可以执行如下:

# javac -classpath .:/full/path/to/sqldeveloper/BC4J/lib/db-ca.jar:/full/path/to/sqldeveloper/jlib/ojmisc.jar sqldeveloper_hash_decode.java
# java -classpath .:/full/path/to/sqldeveloper/BC4J/lib/db-ca.jar:/full/path/to/sqldeveloper/jlib/ojmisc.jar Decode



6> Jakub Jirutk..:

遗憾的是,其他答案中描述的方法在SQL Developer 4.x中不起作用.有适用于3.x和4.x版本的扩展,它非常易于使用:

https://github.com/tomecode/show-me-password-sqldev-jdev

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有