【问题标题】:password string in clojure: how to prevent decompileclojure 中的密码字符串:如何防止反编译
【发布时间】:2016-03-01 08:42:02
【问题描述】:

我有一个 clojure 应用程序,可以与一些人分享。并且在clojure中有预定义的用户名密码。如果有人得到应用程序并反编译它,他可能会看到密码。我唯一的目的是隐藏密码/用户名。有什么简单的方法来做到这一点。我使用

创建了 jar 文件

lein uberjar

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

【问题讨论】:

  • 我会说应用与 Java 相同的规则:stackoverflow.com/questions/12937641/…
  • 如果您的用户不应该知道这些凭据,我会假设他们是用于 3rd 方调用而不是某种后门。如果是这种情况,那么您正在遵循一个非常糟糕的安全策略。是什么阻止您的用户窥探网络?最好给每个用户一个唯一的令牌。这样你就不必担心向他们隐藏它。 (如果我的假设是错误的,请编辑问题以澄清。)

标签: clojure


【解决方案1】:

你不能阻止反编译,你只能混淆它。根据您的安全要求,这可能就足够了。否则,您应该真正考虑将那些敏感的用户名和密码调用转移到您控制的经过身份验证的服务中。如果您更新问题以提供更多信息,我们或许可以提供更具体的建议。

【讨论】:

    【解决方案2】:

    如果您不能依赖外部服务(没有互联网连接),您可以将密码的哈希值存储在您的 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
    

    【讨论】:

      猜你喜欢
      • 2013-07-28
      • 2010-10-18
      • 2010-12-11
      • 2012-01-11
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      相关资源
      最近更新 更多