• 关于

    salt

    的搜索结果

回答

问题已解决 管理方式: 使用普通用户分发控制,其中通过pam模块的用户来限制权限范围。    之前曾新建了一个salt普通用户,根据官网指引,确认了相关目录为755的权限后, chmod755/var/cache/salt/var/cache/salt/master/var/cache/salt/master/jobs/var/run/salt/var/run/salt/master   以及对salt普通用户开放了/var/log/salt目录和/var/log/salt/master日志文件的可写权限, [root@salt~]#ll-d/var/log/salt/drwxrwxr-x2rootroot4096Dec1506:35/var/log/salt/[root@salt~]#ll-d/var/log/salt/master -rw-rw-r--1rootroot86700Dec1602:40/var/log/salt/master   同时需要在master配置文件/etc/salt/master 中 ,定义: client_acl: salt:  -test.ping  配置client_acl的意义,在于指定了使用哪个非root的普通用户可以执行的权限范围。即如上,允许salt用户,可以使用test.ping     但在salt执行命令后,始终卡住无任何回应。考虑还是权限问题,因为通过sudo是正常的。后面将salt用户放到root组里面, #usermod-Grootsalt   并且同时保留root组对salt日志目录与文件的可写权限。这样调整后,普通用户就可以正常执行salt命令了。 [salt@salt~]$salt'zk1'test.pingzk1:True   执行未指定的模块是不允许的  [salt@salt~]$salt'zk1'cmd.run'date'  Failedtoauthenticate! Thisismostlikelybecausethisuserisnotpermittedtoexecutecommands,butthereisasmallpossibilitythatadiskerroroccurred(checkdisk/inodeusage).为了管理权限划分,则通过pam来实现区分不同用户的权限范围。 在/etc/salt/master配置文件中添加pam用户及权限信息 external_auth: pam:  liuyi:   -cmd.*  通过external_auth参数指定了使用pam模块,该系统已在系统级别加入了OpenLDAP,liuyi为Openldap中的账户,当然这里也可以使用系统本地用户,同时也指定了仅允许使用cmd模块。 [salt@salt~]$salt-apam'zk1'cmd.run'date'username:liuyipassword: zk1:  TueDec1602:39:53CST2014 通过salt命令执行时,指定-apam参数来认证授权账户,将会提示输入用户名与密码。验证后,cmd模块即可执行。 [salt@salt~]$salt-apam'zk1'test.pingusername:liuyipassword: Failedtoauthenticate! Thisismostlikelybecausethisuserisnotpermittedtoexecutecommands,butthereisasmallpossibilitythatadiskerroroccurred(checkdisk/inodeusage).  若通过-apam参数,想执行test.ping的指令,是不允许的。因为在配置文件中,授权给liuyi账户的权限只有cmd模块。     系统管理员可以登录到统一的salt普通账户下,在执行分发操作时,验证的是属于系统管理员自己的LDAP账户与密码,并且在salt上也将系统管理员的LDAP的账户与权限范围做设置, 这样就可以实现用户的权限管理。 他们的权限管理确实存在很多问题,后来我们也放弃使用他们的权限管理机制了!我们这边想着日后部署维护管理上简洁些,才想着去使用salt的,那你们后来使用什么方式来管理权限这块?现在我们管理的方式是,服务端不放开权限,只开放仓库编辑权限,客戶端同步配置问题已解决,谢谢~

爱吃鱼的程序员 2020-06-14 18:56:09 0 浏览量 回答数 0

回答

在saltops文件夹下面有一个settings.py的文件 SALT_CONN_TYPE = 'http'  # http    采不采用HTTP模块,独立部署留空就好 SALT_HTTP_URL = 'http://192.168.75.128:5000'   HTTP服务的URL,上面留空这个不填都没关系 PACKAGE_PATH = "D:\\github\\saltops\\doc\\scripts\\"   文件上传的路径,独立部署把这个路径设置成Salt的路径,一般是/srv/salt/ SALT_REST_URL = 'http://192.168.75.128:8001/'  Salt-Api的Url SALT_USER = 'xxxx'   用户名    SALT_PASSWORD = 'xxxx' 密码###### 感谢感谢!马上试试!

kun坤 2020-06-07 09:00:14 0 浏览量 回答数 0

回答

" 在saltops文件夹下面有一个settings.py的文件 SALT_CONN_TYPE = 'http'  # http    采不采用HTTP模块,独立部署留空就好 SALT_HTTP_URL = 'http://192.168.75.128:5000'   HTTP服务的URL,上面留空这个不填都没关系 PACKAGE_PATH = "D:\\github\\saltops\\doc\\scripts\\"   文件上传的路径,独立部署把这个路径设置成Salt的路径,一般是/srv/salt/ SALT_REST_URL = 'http://192.168.75.128:8001/'  Salt-Api的Url SALT_USER = 'xxxx'   用户名    SALT_PASSWORD = 'xxxx' 密码###### 感谢感谢!马上试试!"

montos 2020-05-31 15:10:04 0 浏览量 回答数 0

阿里云高校特惠,助力学生创业梦!0元体验,快速入门云计算!

学生动手场景应用,快速了解并掌握云服务器的各种新奇玩法!

回答

public static void main(String[] args) throws Exception { Random RANDOM = new SecureRandom(); byte[] salt = new byte[16]; RANDOM.nextBytes(salt); - String str = new String(salt,"UTF-8"); + String str = new BASE64Encoder().encode(salt); System.out.println(str); } 参考:https://community.oracle.com/blogs/evanx/2013/01/24/password-salt

蛮大人123 2019-12-02 01:53:39 0 浏览量 回答数 0

问题

使用PHP 5.5的password_hash和password_verify函数

保持可爱mmm 2020-05-10 20:56:04 0 浏览量 回答数 1

问题

从SQL生成随机值

保持可爱mmm 2019-12-01 21:59:49 5 浏览量 回答数 1

问题

如何让java securityRandom 生成的salt只包含字母和数字?

蛮大人123 2019-12-01 20:02:08 2114 浏览量 回答数 1

回答

在使用了salt string之后,md5其实足够可靠固定的私钥来做salt其实不好,一旦私钥泄漏之后就很麻烦,而且最痛苦的其实是你不知道你到底有没有泄漏用户的密码字符串作为salt是更好的办法签名字符串:$sign = md5('$user_id+$user+_password[+浏览器UA[+IP地址[...]]]');里面爱加什么你可以自己发挥存储到cookie里面的字符串为$token = $user_id.','.$sign;然后你需要对用户记录做一个服务器端的缓存,缓存通过用户编号查询,里面至少要包含用户的密码每次用户请求时,都会从缓存里面去拿他的密码来重新计算数字签名做比对这样的好处有:不存在私钥泄漏的问题,即使出问题也不会影响所有用户slat字符串泄漏就等同于用户的密码泄漏,逻辑上是严密的即使有人持有$token字符串,只要用户一修改密码,老的$token就马上失效了在此基础上还可以有其它的发挥,比如用户记录设计专门的一个字段:salt,每次用户登录成功时就生成一个随机字符串更新到salt内,数字签名计算用`// 记得把$user_salt也放到缓存里$sign = md5('$user_id+$user_password+$user_salt+...');`这样一来,每次用户重新登录之后,之前的$token一定会失效,不但安全性更高,而且还实现了每次只允许一个人登录使用最后,记得在用户修改密码之后更新你的缓存

落地花开啦 2019-12-02 02:51:46 0 浏览量 回答数 0

问题

请问钉钉微应用前端不用salt ui 可以吗?

chengmei 2019-12-01 21:34:52 1822 浏览量 回答数 0

回答

随机一个比较长达salt  密码 md5(md5(password)+salt) 放一张表里。没啥问题。salt长度大于15。基本不用担心别人爆破######拿到加密后的数据, 一般人是没有心情在多研究的。。。所以把salt定义在表中是可行的---对一般网站而言######再来麻烦一点 可以根据密码长度 甚至用户的id 去选择不同的密码和盐的混合方式 大大增加暴力破解的成本######salt可以跟password一起存放用户表,泄露也没关系,关键是 password跟 salt一起生成的密钥很难破解###### 嗯,基本上是起个加强“源”的复杂度的作用,防反查是吧 不过如果泄露了,还是可以hash(猜测密码+盐值)==hash值,或穷举或字典,原6位的密码还是可以很快就解出来吧 ######我的密码和盐在同一张表中,不用担心,因为密码是加盐后的值######弄个20多位随机字符做盐值,再加上把密码简单替换,加盐, sha256或 sha512哈希足够强了。######,我一般做小站,都是明码。最多加个md5!!######密文都拿到了,为嘛加密算法拿不到。######楼下的可以接着讨论  md5(md5(password)+salt)和 md5(password+salt)的差别

kun坤 2020-06-03 14:26:46 0 浏览量 回答数 0

回答

$salt = sha1(uniqid(mt_rand(), true));$pwd_db = sha1($salt.sha1($pwd_user));$salt是用户注册时生成一个随机盐值.$pwd_db是数据库保存的加盐的密码哈希.$salt和$pwd_db都存到用户表中.其中:uniqid获取一个带前缀(mt_rand),末尾带熵(true),基于当前时间微秒数的唯一编号.mt_rand用于生成更好的随机数.sha1生成的字符串的长度是40位,字段类型可以设为char(40).

蛮大人123 2019-12-02 01:51:26 0 浏览量 回答数 0

问题

saltstack的权限管理?报错

爱吃鱼的程序员 2020-06-14 18:55:51 0 浏览量 回答数 1

问题

salt.router.preloadrecycle

wy123 2019-12-01 21:23:14 1584 浏览量 回答数 0

回答

回 楼主(购物车大王) 的帖子 我用H5的本地存储解决。DD内置的容器是支持的。同时支持localstorage . websql , indexedDB ------------------------- 回 楼主(购物车大王) 的帖子 也可以用官方 的 salt.fetch 独立的ajax/jsonp模块。 特别说明 salt.fetch就是 nattyFetch 和 nattyStorage 的引用合集,看源代码便知。 为什么这么做?为了给salt的使用者提供一致的开发体验,故将nattyFetch工具以fetch属性的方式集成在salt命名空间下。

人在囧途 2019-12-02 02:16:14 0 浏览量 回答数 0

回答

"这个就是生成随机数啊,python有这个功能######回复 <a href=""http://my.oschina.net/u/231592"" class=""referer"" target=""_blank"">@心扬 : http://www.williamlong.info/archives/1978.html 表示没有多难啊?######没有这么简单,你看看WORDPRESS的密码算法######可以的。直接md5+salt插入数据库######你能写一个方法把一个字符串用wordpress的算法进行加密吗######直接用Python或者PHP生成一个MD5值然后插到数据库是不生效的, 还是建议通过SQL修改密码,这里假设你的用户 登录名为admin, 新密码为123456 UPDATE wordpress.wp_users SET user_pass = MD5( '123456' ) WHERE wp_users.user_login ='admin';###### 不了解wordpress具体是怎么做的, 下面是我的做法 将salt作为密码的一部分存入数据库 import uuid from hashlib import sha256 from hmac import HMAC def secret_hash(source, salt=None, key=app.secret_key): if salt is None: salt = str(uuid.uuid4()) if isinstance(source, unicode): source = source.encode("utf-8") result = source + key for i in xrange(8): result = HMAC(result, salt, sha256).hexdigest() return salt + result database_pw = secret_hash("123456") 然后在验证的时候, 将数据库中的salt和用户输入的密码做hash if database_pw == secret_hash(user_pw, salt=database_pw[:36]) ######具体的代码可以参考 https://github.com/deepgully/me/blob/master/tools/common.py 和 https://github.com/deepgully/me/blob/master/apis/common.py" ![image.png](https://ucc.alicdn.com/pic/developer-ecology/7f74656dface406a88c2c370bd037f14.png)

python小菜菜 2020-05-27 16:25:55 0 浏览量 回答数 0

回答

具有基本安全性的密码存储过程非常简单: 用盐散列密码 为每个用户/密码使用不同的盐 将带有哈希密码的盐存储在数据库中 当他们尝试登录时,请通过相同的方法运行尝试的PW。比较结果。 如果他们输入了正确的密码,则散列的PW将匹配。散列可以保护用户免受攻击,也可以保护看门人members在显示表格的屏幕旁走动。 撒盐和散列PW ' salt size is 32 (0-31 Private Const SaltSize As Integer = 31 ... Dim dbPW As String = TextBox1.Text Dim dbSalt = CreateNewSalt(SaltSize) ' eg: "dsEGWpJpwfAOvdRZyUo9rA==" Dim SaltedPWHash As String = GetSaltedHash(dbPW, dbSalt) ' examples: ' using SHA256: bbKN8wYYgoZmNaG3IsQ2DPS2ZPIOnenl6i5NwUmrGmo= ' using SHA512: ' 0vqZWBIbOlyzL25l9iWk51CxxJTiEM6QUZEH1ph+/aNp+lk4Yf8NYv8RLhYtbqCNpOqO3y8BmM+0YWtbAhE+RA==" 将PW哈希和盐存储为用户记录的一部分。盐不是秘密的,但是当用户更改密码时可以更改盐。 比较登录尝试 ' check if PW entered equals DB Dim pwTry = TextBox2.Text ' hash the login attempt using the salt stored in the DB Dim pwLogin = GetSaltedHash(pwTry, dbSalt) ' compare the hash of what they entered to whats in the DB: If String.Compare(SaltedPWHash, pwLogin, False) = 0 Then ' okay! Console.Beep() End If 如果用户输入相同的PW,则应产生相同的哈希,就这么简单。哈希码并不那么复杂: 哈希方法 Private Function GetSaltedHash(pw As String, salt As String) As String Dim tmp As String = pw & salt ' or SHA512Managed Using hash As HashAlgorithm = New SHA256Managed() ' convert pw+salt to bytes: Dim saltyPW = Encoding.UTF8.GetBytes(tmp) ' hash the pw+salt bytes: Dim hBytes = hash.ComputeHash(saltyPW) ' return a B64 string so it can be saved as text Return Convert.ToBase64String(hBytes) End Using End Function Private Function CreateNewSalt(size As Integer) As String ' use the crypto random number generator to create ' a new random salt Using rng As New RNGCryptoServiceProvider ' dont allow very small salt Dim data(If(size < 7, 7, size)) As Byte ' fill the array rng.GetBytes(data) ' convert to B64 for saving as text Return Convert.ToBase64String(data) End Using End Function 使用诸如GUID(System.Guid.NewGuid.ToString)之类的东西作为引诱对象是很诱人的,但是使用密码随机数生成器并不难。 与哈希密码一样,由于编码,返回字符串更长。 每次用户更改密码时都要创建一个新的盐。不要使用全局盐,它会达到目的。 您还可以多次对PW进行哈希处理。关键部分是要在被攻击时花很长时间才能尝试所有各种组合。 这些功能是Shared/ static类成员的理想人选。 还要注意,肯尼斯(Kenneth)链接的文章值得一读。 请注意,本文提到的The salt should be stored in the user account table alongside the hash 这并不意味着您必须Salt在数据库中有一列。您可以在链接的文章中看到以下内容: Dim dbPW As String = TextBox1.Text Dim dbSalt = CreateNewSalt(SaltSize) ' get the salted PW hash Dim SaltedPWHash As String = GetSaltedHash(dbPW, dbSalt) ' store salt with the hash: SaltedPWHash = String.Format("{0}:{1}", dbSalt, dbPW) ' salt + ":" + hashed PW now ready to store in the db 要从哈希密码中分离出盐: Dim SaltAndPWHash = rdr.Item("PWHash").ToString() Dim split = SaltAndPWHash.Split(":"c) ' split on ":" Dim Salt = split(0) ' element(0) == salt Dim StoredPWHash = split(1) ' element(1) == hashed PW 您需要两个部分:在对PW中的尝试登录进行哈希处理之后,将其与进行比较split(1)。来源:stack overflow

保持可爱mmm 2020-05-17 14:28:58 0 浏览量 回答数 0

回答

防彩虹表就可以了 比如全局用urandom生成一个48字节的salt 每个用户用注册时间生成一个20多字节的salt 再加用户本身的密码 做下sha512 够严实了  ######AES+TwoFish######前段时间做了个小系统,我把密码字段保存成:md5(encode(lower(name)::bytea, 'base64') || encode(password, 'base64')) ######每一个密码设计一个对应的Salt,加密时将明文和Salt连接再加密存储######discuz就是用的这个方法.###### 我们数据库密码现在也做了base64的转换###### 昨天刚刚写一个密码存储的代码,介绍一下,密码->DES(密码的MD5字符做密钥)->置换库(自家保存)->Base64->MD5,字段保存.###### 我直接用的sha256处理了一下,别的暂时还没弄明白是为什么,像  置换、 salt等等方法是什么意思呢######求csdn密码库,我注册邮箱忘了,无法登陆天涯删帖

kun坤 2020-06-06 11:44:02 0 浏览量 回答数 0

问题

salt ui 中的参数怎么在服务端中接收啊

技术小牛 2019-12-01 21:26:58 1178 浏览量 回答数 0

回答

Resaltui 和 tingle-UI 是什么关系? http://g.alicdn.com/platform/tingle-ui/1.2.0/docs/docs.html#tingle-icon 我的理解正好相反, 以这个文档为准, 这个是最新的. 相应的index.html的引入文件版本也需要调整到最新. CDN地址: http://alinw.alicdn.com/platform/tingle-ui/1.2.0/salt-ui.min.js http://alinw.alicdn.com/platform/tingle-ui/1.2.0/salt-ui.min.css salt-ui的前身是tingle-ui.

钉友 2019-12-02 00:03:31 0 浏览量 回答数 0

问题

phoenix 的加盐,SALT_BUCKETS 怎么来评估了?如果region超过了默认的大小,会分离吗?

hbase小助手 2019-12-01 19:22:22 765 浏览量 回答数 1

问题

salt-ui

shuizengqi 2019-12-01 21:41:07 3848 浏览量 回答数 4

问题

salt怎么进行多页面开发??

canca 2019-12-01 21:12:21 1689 浏览量 回答数 1

问题

java这种加密方法,怎么解密得到原来的密码 - java报错

montos 2020-06-04 14:01:31 3 浏览量 回答数 1

问题

java这种加密方法,怎么解密得到原来的密码:报错 

kun坤 2020-06-04 21:16:35 2 浏览量 回答数 1

回答

SpringSecurity的登录验证过程概括起来就是两步: 1. 产生一个Authentication实现(例如常用的UsernamePasswordAuthenticationToken)调用AuthenticationManager的authenticate()方法获取到认证后的Authentication对象(如果过程抛出AuthenticationException表示验证失败,根据异常类又分为内部异常,用户名密码错误,用户不存在,用户被禁用等)。简单来说,验证过程就是由AuthenticationManager的authenticate方法实现的。为了在系统中同时提供多种登录方式(比如微信登录,用户名密码登录等),AuthenticationManager并不直接处理认证过程,而是将认证过程委派给内置的AuthenticationProvider来处理,一个常见实现就是DaoAuthenticationProvider。 做一些后续处理,例如将获取到的已通过验证的Authentication对象放置在当前的安全上下文中,调用Session同步,从RequestCache中取出登录前请求地址回调等。或者登录失败的处理。 如果你只是要修改对密码的加盐过程,实现自己的PasswordEncoder替换默认的即可。如果你要控制整个验证Authentication的过程,可以实现一个自己的AuthenticationProvider,并把他注册给AuthenticationManager。系统里面可以有多个AuthenticationProvider实现,一般是按顺序和Authentication的具体类型来判定是否由该AuthenticationProvider处理。 Spring Security提供了上述过程的一个简单的默认实现,当然,你都可以替换。 如果觉得上面的过程看天书的话,请详细阅读Spring Security官方文档。 ######回复 @happymzw : 另外Spring Security目前比较推荐使用的是BCryptPasswordEncoder,他不需要加盐。(可以看一下BCrypt的介绍)######回复 @happymzw : 这个感觉还是得细读一下文档对照源码看看便于理解。可以用Maven来构建项目,会给你下相应的Java包源代码,比如matches()方法可以用IDE的功能找到所有调用他的地方,顺着这个梳理基本的调用关系就容易理清楚了。######感觉spring security好多东西呀,第一次用这个,踩了不知多少坑了,还在坑中没起来……######就是不知道在PasswordEncoder里面怎么取回存在数库里的盐值,所以 public boolean matches(CharSequence charSequence, String s) { return false; }这个方法没办法校验密码是不是正确的……现在改成自己写了一个CustomAuthenticationProvider######没用过springSecurity的登录验证,不过可以自定义登录的,登录成功然后加载登录用户的权限即可,认证过程不变###### 引用来自“逝水fox”的评论 SpringSecurity的登录验证过程概括起来就是两步: 产生一个Authentication实现(例如常用的UsernamePasswordAuthenticationToken)调用AuthenticationManager的authenticate()方法获取到认证后的Authentication对象(如果过程抛出AuthenticationException表示验证失败,根据异常类又分为内部异常,用户名密码错误,用户不存在,用户被禁用等)。简单来说,验证过程就是由AuthenticationManager的authenticate方法实现的。为了在系统中同时提供多种登录方式(比如微信登录,用户名密码登录等),AuthenticationManager并不直接处理认证过程,而是将认证过程委派给内置的AuthenticationProvider来处理,一个常见实现就是DaoAuthenticationProvider。 做一些后续处理,例如将获取到的已通过验证的Authentication对象放置在当前的安全上下文中,调用Session同步,从RequestCache中取出登录前请求地址回调等。或者登录失败的处理。 如果你只是要修改对密码的加盐过程,实现自己的PasswordEncoder替换默认的即可。如果你要控制整个验证Authentication的过程,可以实现一个自己的AuthenticationProvider,并把他注册给AuthenticationManager。系统里面可以有多个AuthenticationProvider实现,一般是按顺序和Authentication的具体类型来判定是否由该AuthenticationProvider处理。 Spring Security提供了上述过程的一个简单的默认实现,当然,你都可以替换。 如果觉得上面的过程看天书的话,请详细阅读Spring Security官方文档。 //DaoAuthenticationProvider里面的设置PasswordEncoder public void setPasswordEncoder(Object passwordEncoder) { Assert.notNull(passwordEncoder, "passwordEncoder cannot be null"); if(passwordEncoder instanceof PasswordEncoder) { this.setPasswordEncoder((PasswordEncoder)passwordEncoder); } else if(passwordEncoder instanceof org.springframework.security.crypto.password.PasswordEncoder) { final org.springframework.security.crypto.password.PasswordEncoder delegate = (org.springframework.security.crypto.password.PasswordEncoder)passwordEncoder; this.setPasswordEncoder(new PasswordEncoder() { public String encodePassword(String rawPass, Object salt) { this.checkSalt(salt); return delegate.encode(rawPass); } public boolean isPasswordValid(String encPass, String rawPass, Object salt) { this.checkSalt(salt); return delegate.matches(rawPass, encPass); } private void checkSalt(Object salt) { Assert.isNull(salt, "Salt value must be null when used with crypto module PasswordEncoder"); } }); } else { throw new IllegalArgumentException("passwordEncoder must be a PasswordEncoder instance"); } } //这里面设置encoder的时候,spring securiry自己做了这样的处理………… //BCryptPasswordEncoder public String encode(CharSequence rawPassword) { String salt; if(this.strength > 0) { if(this.random != null) { salt = BCrypt.gensalt(this.strength, this.random); } else { salt = BCrypt.gensalt(this.strength); } } else { salt = BCrypt.gensalt(); } return BCrypt.hashpw(rawPassword.toString(), salt); } // 他这里是自己生成了一个盐值

kun坤 2020-06-08 13:15:45 0 浏览量 回答数 0

问题

salt-ui text-field 数字输入问题

stwflyfox 2019-12-01 21:13:31 1928 浏览量 回答数 2

问题

salt-ui怎么使用呢?想找一个demo,代码demo不是官方提供的体验

田坤 2019-12-01 21:45:41 2165 浏览量 回答数 1

回答

package main import ( "crypto/sha256" "encoding/base64" "strconv" "crypto/hmac" "hash" "io" "net/http" "strings" "math/rand" "time" "fmt" ) // djnago 的实现细节请参考 Python 和 djnago 文档: // djnago.contrib.auth.hashers.make_password // djnago.utils.crypto import pbkdf2 // hashlib.sha256 // base64 func main() { http.HandleFunc("/djnagopwd", gendjnagopwd) http.ListenAndServe(":7070", nil) } func gendjnagopwd(rw http.ResponseWriter, req *http.Request){ req.ParseForm(); attempted := req.FormValue("attempted"); var temp = req.FormValue("salt"); var salt []byte if temp != ""{ salt = []byte (temp) // 盐,是一个随机字符串,每一个用户都不一样 }else{ salt = []byte(genSalt()) } fmt.Println("-----------------salt::::: "+salt+" ----------------"); pwd := []byte(attempted) // 用户设置的原始密码 iterations := 15000 // 加密算法的迭代次数,15000 次 digest := sha256.New // digest 算法,使用 sha256 // 第一步:使用 pbkdf2 算法加密 dk := Key(pwd, salt, iterations, 32, digest) // 第二步:Base64 str := base64.StdEncoding.EncodeToString(dk) // 第三步:组合加密算法、迭代次数、盐、密码和分割符号 "$" io.WriteString(rw, "pbkdf2_sha256" + "$" + strconv.FormatInt(int64(iterations), 10) + "$" + string(salt) + "$" + str); } func Key(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { prf := hmac.New(h, password) hashLen := prf.Size() numBlocks := (keyLen + hashLen - 1) / hashLen var buf [4]byte dk := make([]byte, 0, numBlocks*hashLen) U := make([]byte, hashLen) for block := 1; block <= numBlocks; block++ { // N.B.: || means concatenation, ^ means XOR // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter // U_1 = PRF(password, salt || uint(i)) prf.Reset() prf.Write(salt) buf[0] = byte(block >> 24) buf[1] = byte(block >> 16) buf[2] = byte(block >> 8) buf[3] = byte(block) prf.Write(buf[:4]) dk = prf.Sum(dk) T := dk[len(dk)-hashLen:] copy(U, T) // U_n = PRF(password, U_(n-1)) for n := 2; n <= iter; n++ { prf.Reset() prf.Write(U) U = U[:0] U = prf.Sum(U) for x := range U { T[x] ^= U[x] } } } return dk[:keyLen] } /** *生成随机字符 **/ func genSalt() string { length := 12 rand.Seed(time.Now().UnixNano()) rs := make([]string, length) for start := 0; start < length; start++ { t := rand.Intn(3) if t == 0 { rs = append(rs, strconv.Itoa(rand.Intn(10))) } else if t == 1 { rs = append(rs, string(rand.Intn(26)+65)) } else { rs = append(rs, string(rand.Intn(26)+97)) } } return strings.Join(rs, "") } 已解决,网上找了几个语言的pbkdf2_sha256算法,计算出的结果都和python不一样。 试过php/java/nodejs/golang,最后只有golang结果和python一致,无奈只有用golang生成密码,java调用golang的http服务,下面贴出代码: ######亲测可用

kun坤 2020-06-08 09:45:50 0 浏览量 回答数 0

回答

MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。 MD5算法具有以下特点: 1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。 2、容易计算:从原数据计算出MD5值很容易。 3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。 4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。 一个工具类 import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Arrays; public class MyMD5Util { private static final String HEX_NUMS_STR="0123456789ABCDEF"; private static final Integer SALT_LENGTH = 12; /** * 将16进制字符串转换成字节数组 * @param hex * @return */ public static byte[] hexStringToByte(String hex) { int len = (hex.length() / 2); byte[] result = new byte[len]; char[] hexChars = hex.toCharArray(); for (int i = 0; i < len; i++) { int pos = i * 2; result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4 | HEX_NUMS_STR.indexOf(hexChars[pos + 1])); } return result; } /** * 将指定byte数组转换成16进制字符串 * @param b * @return */ public static String byteToHexString(byte[] b) { StringBuffer hexString = new StringBuffer(); for (int i = 0; i < b.length; i++) { String hex = Integer.toHexString(b[i] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } hexString.append(hex.toUpperCase()); } return hexString.toString(); } /** * 验证口令是否合法 * @param password * @param passwordInDb * @return * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException */ public static boolean validPassword(String password, String passwordInDb) throws NoSuchAlgorithmException, UnsupportedEncodingException { //将16进制字符串格式口令转换成字节数组 byte[] pwdInDb = hexStringToByte(passwordInDb); //声明盐变量 byte[] salt = new byte[SALT_LENGTH]; //将盐从数据库中保存的口令字节数组中提取出来 System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH); //创建消息摘要对象 MessageDigest md = MessageDigest.getInstance("MD5"); //将盐数据传入消息摘要对象 md.update(salt); //将口令的数据传给消息摘要对象 md.update(password.getBytes("UTF-8")); //生成输入口令的消息摘要 byte[] digest = md.digest(); //声明一个保存数据库中口令消息摘要的变量 byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH]; //取得数据库中口令的消息摘要 System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, digestInDb.length); //比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同 if (Arrays.equals(digest, digestInDb)) { //口令正确返回口令匹配消息 return true; } else { //口令不正确返回口令不匹配消息 return false; } } /** * 获得加密后的16进制形式口令 * @param password * @return * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException */ public static String getEncryptedPwd(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException { //声明加密后的口令数组变量 byte[] pwd = null; //随机数生成器 SecureRandom random = new SecureRandom(); //声明盐数组变量 byte[] salt = new byte[SALT_LENGTH]; //将随机数放入盐变量中 random.nextBytes(salt); //声明消息摘要对象 MessageDigest md = null; //创建消息摘要 md = MessageDigest.getInstance("MD5"); //将盐数据传入消息摘要对象 md.update(salt); //将口令的数据传给消息摘要对象 md.update(password.getBytes("UTF-8")); //获得消息摘要的字节数组 byte[] digest = md.digest(); //因为要在口令的字节数组中存放盐,所以加上盐的字节长度 pwd = new byte[digest.length + SALT_LENGTH]; //将盐的字节拷贝到生成的加密口令字节数组的前12个字节,以便在验证口令时取出盐 System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH); //将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节 System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length); //将字节数组格式加密后的口令转化为16进制字符串格式的口令 return byteToHexString(pwd); } } 测试类客户端 import com.huaidan.utils.MyMD5Util; import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.Map; public class Client { private static Map users = new HashMap(); public static void main(String[] args){ String userName = "zyg"; String password = "123"; registerUser(userName,password); userName = "changong"; password = "456"; registerUser(userName,password); String loginUserId = "zyg"; String pwd = "123"; try { if(loginValid(loginUserId,pwd)){ System.out.println("欢迎登陆!!!"); }else{ System.out.println("口令错误,请重新输入!!!"); } } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 注册用户 * * @param userName * @param password */ public static void registerUser(String userName,String password){ String encryptedPwd = null; try { encryptedPwd = MyMD5Util.getEncryptedPwd(password); System.out.println("加密后的用户密码"+encryptedPwd); users.put(userName, encryptedPwd); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 验证登陆 * * @param userName * @param password * @return * @throws UnsupportedEncodingException * @throws NoSuchAlgorithmException */ public static boolean loginValid(String userName,String password) throws NoSuchAlgorithmException, UnsupportedEncodingException{ String pwdInDb = (String)users.get(userName); System.out.println(pwdInDb); if(null!=pwdInDb){ // 该用户存在 return MyMD5Util.validPassword(password, pwdInDb); }else{ System.out.println("不存在该用户!!!"); return false; } } }

问问小秘 2020-04-30 16:35:36 0 浏览量 回答数 0

回答

"<pre class=""brush:cpp; toolbar: true; auto-links: false;"">package main import ( "crypto/sha256" "encoding/base64" "strconv" "crypto/hmac" "hash" "io" "net/http" "strings" "math/rand" "time" "fmt" ) // djnago 的实现细节请参考 Python 和 djnago 文档: // djnago.contrib.auth.hashers.make_password // djnago.utils.crypto import pbkdf2 // hashlib.sha256 // base64 func main() { http.HandleFunc("/djnagopwd", gendjnagopwd) http.ListenAndServe(":7070", nil) } func gendjnagopwd(rw http.ResponseWriter, req *http.Request){ req.ParseForm(); attempted := req.FormValue("attempted"); var temp = req.FormValue("salt"); var salt []byte if temp != ""{ salt = []byte (temp) // 盐,是一个随机字符串,每一个用户都不一样 }else{ salt = []byte(genSalt()) } fmt.Println("-----------------salt::::: "+salt+" ----------------"); pwd := []byte(attempted) // 用户设置的原始密码 iterations := 15000 // 加密算法的迭代次数,15000 次 digest := sha256.New // digest 算法,使用 sha256 // 第一步:使用 pbkdf2 算法加密 dk := Key(pwd, salt, iterations, 32, digest) // 第二步:Base64 str := base64.StdEncoding.EncodeToString(dk) // 第三步:组合加密算法、迭代次数、盐、密码和分割符号 "$" io.WriteString(rw, "pbkdf2_sha256" + "$" + strconv.FormatInt(int64(iterations), 10) + "$" + string(salt) + "$" + str); } func Key(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { prf := hmac.New(h, password) hashLen := prf.Size() numBlocks := (keyLen + hashLen - 1) / hashLen var buf [4]byte dk := make([]byte, 0, numBlocks*hashLen) U := make([]byte, hashLen) for block := 1; block <= numBlocks; block++ { // N.B.: || means concatenation, ^ means XOR // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter // U_1 = PRF(password, salt || uint(i)) prf.Reset() prf.Write(salt) buf[0] = byte(block >> 24) buf[1] = byte(block >> 16) buf[2] = byte(block >> 8) buf[3] = byte(block) prf.Write(buf[:4]) dk = prf.Sum(dk) T := dk[len(dk)-hashLen:] copy(U, T) // U_n = PRF(password, U_(n-1)) for n := 2; n <= iter; n++ { prf.Reset() prf.Write(U) U = U[:0] U = prf.Sum(U) for x := range U { T[x] ^= U[x] } } } return dk[:keyLen] } /** *生成随机字符 **/ func genSalt() string { length := 12 rand.Seed(time.Now().UnixNano()) rs := make([]string, length) for start := 0; start < length; start++ { t := rand.Intn(3) if t == 0 { rs = append(rs, strconv.Itoa(rand.Intn(10))) } else if t == 1 { rs = append(rs, string(rand.Intn(26)+65)) } else { rs = append(rs, string(rand.Intn(26)+97)) } } return strings.Join(rs, "") } 已解决,网上找了几个语言的pbkdf2_sha256算法,计算出的结果都和python不一样。 试过php/java/nodejs/golang,最后只有golang结果和python一致,无奈只有用golang生成密码,java调用golang的http服务,下面贴出代码: ###### 亲测可用"

montos 2020-06-04 14:36:15 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站