[前][次][番号順一覧][スレッド一覧]

ruby-changes:53934

From: shyouhei <ko1@a...>
Date: Mon, 3 Dec 2018 14:46:52 +0900 (JST)
Subject: [ruby-changes:53934] shyouhei:r66154 (trunk): string.c: [DOC] deprecate String#crypt [ci skip] [Feature #14915]

shyouhei	2018-12-03 14:46:46 +0900 (Mon, 03 Dec 2018)

  New Revision: 66154

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=66154

  Log:
    string.c: [DOC] deprecate String#crypt [ci skip] [Feature #14915]

  Modified files:
    trunk/NEWS
    trunk/string.c
Index: NEWS
===================================================================
--- NEWS	(revision 66153)
+++ NEWS	(revision 66154)
@@ -281,6 +281,8 @@ sufficient information, see the ChangeLo https://github.com/ruby/ruby/blob/trunk/NEWS#L281
 
 [String]
 
+  * String#crypt is now deprecated. [Feature #14915]
+
   [New features]
 
     * String#split yields each substring to the block if given. [Feature #4780]
Index: string.c
===================================================================
--- string.c	(revision 66153)
+++ string.c	(revision 66154)
@@ -9223,17 +9223,60 @@ rb_str_oct(VALUE str) https://github.com/ruby/ruby/blob/trunk/string.c#L9223
  *  call-seq:
  *     str.crypt(salt_str)   -> new_str
  *
- *  Applies a one-way cryptographic hash to <i>str</i> by invoking the
- *  standard library function <code>crypt(3)</code> with the given
- *  salt string.  While the format and the result are system and
- *  implementation dependent, using a salt matching the regular
- *  expression <code>\A[a-zA-Z0-9./]{2}</code> should be valid and
- *  safe on any platform, in which only the first two characters are
- *  significant.
- *
- *  This method is for use in system specific scripts, so if you want
- *  a cross-platform hash function consider using Digest or OpenSSL
- *  instead.
+ *  Returns the string generated by calling <code>crypt(3)</code>
+ *  standard library function with <code>str</code> and
+ *  <code>salt_str</code>, in this order, as its arguments.  Please do
+ *  not use this method any longer.  It is legacy; provided only for
+ *  backward compatibility with ruby scripts in earlier days.  It is
+ *  bad to use in contemporary programs for several reasons:
+ *
+ *    * Behaviour of C's <code>crypt(3)</code> depends on the OS it is
+ *      run.  The generated string lacks data portability.
+ *
+ *    * On some OSes such as Mac OS, <code>crypt(3)</code> never fails
+ *      (i.e. silently ends up in unexpected results).
+ *
+ *    * On some OSes such as Mac OS, <code>crypt(3)</code> is not
+ *      thread safe.
+ *
+ *    * So-called "traditional" usage of <code>crypt(3)</code> is very
+ *      very very weak.  According to its manpage, Linux's traditional
+ *      <code>crypt(3)</code> output has only 2**56 variations; too
+ *      easy to blute force today.  And this is the default behaviour.
+ *
+ *    * In order to make things robust some OSes implement so-called
+ *      "modular" usage. To go through, you have to do a complex
+ *      build-up of the <code>salt_str</code> parameter, by hand.
+ *      Failure in generation of a proper salt string tends not to
+ *      yield any errors; typo in parameters are normally not
+ *      detectable.
+ *
+ *        * For instance, in the following example, second invocation
+ *          of <code>String#crypt</code> is wrong; it has typo in
+ *          "round=" (lacks "s").  However the call does not fail and
+ *          something unexpected is generated.
+ *
+ *             "foo".crypt("$5$rounds=1000$salt$") # OK, proper usage
+ *             "foo".crypt("$5$round=1000$salt$")  # Typo not detected
+ *
+ *    * Even in the "modular" mode, some hash functions are considered
+ *      archaic and no longer recommended at all; for instance module
+ *      <code>$1$</code> is officially abandoned by its author: see
+ *      http://phk.freebsd.dk/sagas/md5crypt_eol.html .  For another
+ *      instance module <code>$3$</code> is considered completely
+ *      broken: see the manpage of FreeBSD.
+ *
+ *    * On some OS such as Mac OS, there is no modular mode. Yet, as
+ *      written above, <code>crypt(3)</code> on Mac OS never fails.
+ *      This means even if you build up a proper salt string it
+ *      generates a traditional DES hash anyways, and there is no way
+ *      for you to be aware of.
+ *
+ *          "foo".crypt("$5$rounds=1000$salt$") # => "$5fNPQMxC5j6."
+ *
+ *  If for some reason you cannot migrate to other secure contemporary
+ *  password hashing algorithms, install the string-crypt gem and
+ *  <code>requiire 'string/crypt'</code> to continue using it.
  */
 
 static VALUE

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]