2016-02-29 85 views
0

我有一个clojure应用程序,将与一些人共享。并且在clojure中预先定义了用户名密码。如果有人拿到应用并反编译,他可能会看到密码。我唯一的意图是隐藏密码/用户名。什么是简单的方法来做到这一点。我创建使用clojure中的密码字符串:如何防止反编译

雷音jar文件uberjar

,然后发送独立的jar文件的客户端代码。

+5

我要说的是,相同的规则在Java的应用:http://stackoverflow.com/questions/12937641/ handling-passwords-used-for-auth-in-source-code – nha

+0

你不能那样做。 – SLaks

+0

如果您的用户不应该知道这些凭据,我将假定他们是为第三方调用,而不是某种后门程序。如果是这样的话,那么你正在遵循一个非常糟糕的安全策略。什么阻止你的用户窥探网络?给每个用户一个独特的令牌会更好。那么你不必担心把它从他们身上隐藏起来。 (如果我的假设错了,请编辑该问题以澄清。) – muhuk

回答

1

您无法防止反编译,只能对其进行混淆。根据您的安全要求,这可能是足够的。否则,您应该将这些敏感的用户名和密码调用转移到您控制的已验证服务中。如果您更新问题以提供更多信息,我们可能会提供更具体的推荐。

0

如果您不能依赖外部服务(无互联网连接),您可以将密码的散列存储在您的uberjar文件中。

; utility methods 
(defn to-base64 [bytes] 
    (String. (.encode (java.util.Base64/getEncoder) bytes))) 

; function to encrypt string formatted password 
(defn encrypt-password [string] 
    (let [ sha (java.security.MessageDigest/getInstance "SHA")] 
    (.update sha (.getBytes string)) 
    (to-base64 
    (.digest sha)))) 

; call this one time, to store the secret in encrypted form 
; this would be part of your jar file, but regular users cannot 
; (probably) decrypt this. 
(defn save-password [ secret-password ] 
    (spit 
    "secret" 
    (encrypt-password secret-password))) 

; use this to validate this 
(defn validate-password [ input ] 
    (.equalsIgnoreCase 
    (String. (slurp "secret")) 
    (String. (encrypt-password input)))) 

最后,你可以用上面的方法创建并核对密码:

(save-password "hello") 
(validate-password "hello") 
; true 

(save-password "hellome!") 
(validate-password "hello") 
; false